gpt4 book ai didi

java - JMS 和 "transactional messages"

转载 作者:行者123 更新时间:2023-12-01 12:48:36 24 4
gpt4 key购买 nike

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

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

我的问题是,如何处理我想要“处理消息”而不是 session 的情况。想象一下,您希望在一个非常并发的场景中接收大量交易,并且在接收到任何单独的消息并进行处理时,您希望“message.commit()”。我们如何实现这个场景?
我是否必须继续为每条想要出队的消息创建 QueueSessions?开销不是太大了吗?

提前致谢

最佳答案

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

根据您的要求,您可以使用带有 CLIENT_ACKNOWLEDGE 选项的非事务性 session 。喜欢:

createSession(false, Session.CLIENT_ACKNOWLEDGE);

CLIENT_ACKNOWLEDGE session 可让您执行一条 message.Acknowledge,告知消息传递提供程序从队列/主题中删除该消息。

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

关于java - JMS 和 "transactional messages",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com