Java JMS和";“事务性消息”;

Java JMS和";“事务性消息”;,java,jms,Java,Jms,我是JMS新手,非常感谢您的帮助 我读到的关于JMS的所有内容都给我这样的印象,即“保存事务”的对象是会话对象,这意味着当我们“session.commit()”时,自上次提交以来发生的所有事情都会得到解决 我的问题是,如何处理我想要“处理消息”的模式,而不是会话。假设您希望在一个非常并发的场景中接收大量交易,并且在接收到任何单个消息并进行处理后,您希望“message.commit()”。我们如何实现这个场景? 我是否必须继续为我想退出队列的每条消息创建队列会话?开销不是太大吗 提前感谢没错,

我是JMS新手,非常感谢您的帮助

我读到的关于JMS的所有内容都给我这样的印象,即“保存事务”的对象是会话对象,这意味着当我们“session.commit()”时,自上次提交以来发生的所有事情都会得到解决

我的问题是,如何处理我想要“处理消息”的模式,而不是会话。假设您希望在一个非常并发的场景中接收大量交易,并且在接收到任何单个消息并进行处理后,您希望“message.commit()”。我们如何实现这个场景?
我是否必须继续为我想退出队列的每条消息创建队列会话?开销不是太大吗


提前感谢

没错,JMS会话对象负责管理事务。Commit()调用提交该会话中接收/发送的所有消息。类似地,Session.Rollback()在会话中回滚消息

根据您的要求,您可以使用带有客户端确认选项的非事务会话。比如:

createSession(false, Session.CLIENT_ACKNOWLEDGE);
客户端确认会话让您执行消息。确认,它告诉消息传递提供程序从队列/主题中删除该消息

但是您必须记住,message.Acknowledge的实现依赖于实现。一些消息传递提供程序允许每条消息进行确认,而其他消息传递提供程序则允许对所有消息进行确认。在每消息确认中,只有调用确认的消息才会从消息传递提供程序中删除。所有其他已收到且未确认的消息将不会被删除。其中,与“全部确认”类型的实现一样,对一条消息调用确认将确认之前收到的所有消息。这与在事务性会话中执行session.commit相同