这更像是一个概念性问题:我目前有一个工作的activemq队列,由Java Spring应用程序使用。现在我希望队列不要永久删除消息,直到Java应用程序告诉它消息已正确保存在DB中。在阅读文档之后,我得到了事务性和美国的commit()/ rollback()方法。如果我在这里错了,请纠正我。
我的问题出现在我通过互联网找到的每个例子告诉我配置应用程序以这种或那种方式工作,但我的鼻子告诉我,我应该设置队列本身以我想要的方式工作。我找不到办法。
否则,队列是否以不同方式工作,具体取决于使用者应用程序配置如何工作?我错了什么?
提前致谢
答案 0 :(得分:0)
它自己的队列不知道任何事务系统,但你可以将第一个参数boolean传递给true来创建一个事务会话,但我在创建会话时建议使用INDIVIDUAL_ACKNOWLEDGE,因为你可以逐个管理消息。可以在spring jms delete_transition(t)
上设置。
DefaultMessageListenerContainer
并调用此方法来确认消息,除非未调用该方法,否则消息被视为已分派但不是ack。
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE
<强>更新强>
ActiveMQTextMessage.acknowledge();
可以像这样使用:
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE
ActiveMQ中有两种交易支持。 JMS事务 - Session上的commit()/ rollback()方法(就像在JDBC连接上执行commit()/ rollback()) XA事务 - XASession通过与Message Broker通信而充当XAResource,而不像JDBC连接通过与数据库通信在XA事务中发生。
http://activemq.apache.org/how-do-transactions-work.html
我应该使用XA事务(两阶段提交吗?) JMS的一个常见用途是使用来自队列或主题的消息,使用数据库或EJB处理它们,然后确认/提交消息。 如果您使用多个资源;例如读取JMS消息并写入数据库,您确实应该使用XA - 其目的是为多个事务资源提供原子事务。例如,当您完成数据库更新时,会有一个小窗口,您的更改将提交到您提交/确认消息的时间点;如果该窗口内存在网络/硬件/进程故障,则将重新传递该消息,并且您最终可能会处理重复的消息。