JMS和"交易消息"

时间:2014-06-26 19:43:50

标签: java jms

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

我读到的关于JMS的所有内容都给我的印象是"持有交易的对象"是一个会话对象,这意味着当我们" session.commit()"时,自上次提交以来发生的所有事情都已解决。

我的问题是,如何处理我想要的模式"交易消息"而不是会话。想象一下,您希望在非常并发的场景中接收大量交易,并且在收到任何单独的消息和处理后,您希望" message.commit()"。我们如何实施这种情况? 我是否必须为每个要出列的邮件继续创建QueueSessions?是不是有太多开销?

提前致谢

1 个答案:

答案 0 :(得分:1)

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

根据您的要求,您可以使用CLIENT_ACKNOWLEDGE选项的非事务会话。像:

createSession(false, Session.CLIENT_ACKNOWLEDGE);

CLIENT_ACKNOWLEDGE会话允许您执行message.Acknowledge,它告诉消息传递提供程序从队列/主题中删除该消息。

但是你必须记住,message.Acknowledge的实现是依赖于实现的。一些消息传递提供者允许每个消息确认,而其他消息提供者确认所有消息。在每条消息确认中,将仅从消息提供程序中删除调用确认的消息。收到但未确认的所有其他邮件将不会被删除。在“承认所有人”的地方实现类型,在一条消息上调用确认将确认之前收到的所有消息。这与在事务会话中执行session.commit相同。