【发布时间】:2011-04-19 23:41:06
【问题描述】:
已编辑问题:我正在开发多线程 JMS 接收器和发布器代码(独立的多线程 Java 应用程序)。 MOM 是 MQSonic。 从队列接收 XML 消息,调用存储过程(执行需要 70 秒)并在 90 秒内将响应发送到主题。 当代理关闭或应用程序处于预定关闭状态时,我需要处理一个条件。即从 Queue 接收消息并在 java 中处理消息的情况,同时 Queue 和 Topic 都将关闭。然后要处理那些不在队列中且未发送到主题但在 java 内存中的消息,我有以下选项:
(1) 将 CLIENT_ACKNOWLEDGE 会话创建为: 连接.createSession(假,javax.jms.Session.CLIENT_ACKNOWLEDGE) 这里我只会在事务(存储过程)成功完成后才确认消息
(2) 使用事务处理会话,即 connection.createSession(true, -1)。在这种方法中,由于事务(存储过程)中的一些异常,消息被回滚并重新传递。他们一次又一次地回滚并继续,直到我终止程序。我可以限制从队列中重新传递 jms 消息的次数吗?
另外在上述两种方法中,哪一种比较好?
【问题讨论】:
-
哇,您真的可能想考虑编辑这个问题以使其更清晰......或者至少使用可理解的语法。我看到这篇文章中嵌入了很多熟悉的概念,但我仍然没有“大局”了解您的要求。
-
如果我理解正确 - 问题是,当队列不可用时,如何避免发布者代码无休止地尝试将消息重新传递到队列?
-
问题已编辑,如有任何混淆,我们深表歉意。
-
根据编辑,我删除了我的回复。 Crowne 关于检查消息的回退计数的答案是我通常建议的。在 WMQ 中有一个队列配置可以为您执行此操作并且不需要任何代码。我不知道索尼克是否有类似的功能。
-
Sonic 确实有这个功能,它是 connectionfactory 的一个属性。我已经在下面的回答中详细说明了。
标签: java transactions jms messaging