Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将activemq配置为事务性_Java_Spring_Configuration_Activemq_Spring Jms - Fatal编程技术网

Java 将activemq配置为事务性

Java 将activemq配置为事务性,java,spring,configuration,activemq,spring-jms,Java,Spring,Configuration,Activemq,Spring Jms,这更像是一个概念性的问题:我目前有一个工作的activemq队列,由JavaSpring应用程序使用。现在,我希望队列不要永久删除消息,直到Java应用程序告诉它消息已正确保存在DB中。在阅读了文档之后,我必须使用commit()/rollback()方法进行事务处理。如果我错了,请纠正我 我的问题来自于我在互联网上找到的每一个例子,它们告诉我如何配置应用程序,使其以这种或那种方式工作,但我的鼻子告诉我,我应该将队列本身设置为以我想要的方式工作。我找不到方法来做这件事 否则,队列是否只是以不同的

这更像是一个概念性的问题:我目前有一个工作的activemq队列,由JavaSpring应用程序使用。现在,我希望队列不要永久删除消息,直到Java应用程序告诉它消息已正确保存在DB中。在阅读了文档之后,我必须使用commit()/rollback()方法进行事务处理。如果我错了,请纠正我

我的问题来自于我在互联网上找到的每一个例子,它们告诉我如何配置应用程序,使其以这种或那种方式工作,但我的鼻子告诉我,我应该将队列本身设置为以我想要的方式工作。我找不到方法来做这件事

否则,队列是否只是以不同的方式工作,取决于使用者应用程序的工作配置?我做错了什么


提前感谢队列本身不知道任何事务系统,但您可以将第一个参数布尔值传递为true以创建事务会话,但我建议在创建会话时单独确认,因为您可以逐个管理消息。可以在SpringJMS
DefaultMessageListenerContainer
上设置

ActiveMQSession.个人确认
并调用此方法来确认消息,除非未调用该方法,否则该消息被视为已调度但未确认

ActiveMQTextMessage.acknowledge();
更新:

ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE
可以这样使用:

onMessage(ActiveMQTextMessage message)
try {
    do some stuff in the database
    jdbc.commit(); (unless auto-commit is enabled on the JDBC)
    message.acknowledge();
}
catch (Exception e) {
}
ActiveMQ中有两种事务支持。 JMS事务—会话上的commit()/rollback()方法(类似于在JDBC连接上执行commit()/rollback()) XA事务—其中XASession通过与消息代理通信充当XAResource,更像是通过与数据库通信在XA事务中发生JDBC连接

我是否应该使用XA事务(两阶段提交?) JMS的一个常见用途是使用队列或主题中的消息,使用数据库或EJB处理它们,然后确认/提交消息。 如果您正在使用多个资源;e、 g.读取JMS消息并写入数据库,您真的应该使用XA——它的目的是为多个事务资源提供原子事务。例如,从完成数据库更新和提交更改到提交/确认消息时,有一个小窗口;如果该窗口内出现网络/硬件/进程故障,则消息将重新传递,您可能会处理重复的消息


我建议通过Message.acknowledge()明确确认。谢谢你的回复,哈森。然后,如果消费者在将消息保存到DB中之前死亡,消息会丢失吗?这是无法避免的?我试图跟上,但发现了同样的问题。再次感谢。顺便说一下,刚找到XA。这能解决我的问题吗?是的,看看我的更新,如果你对交易不满意,我认为个人确认符合你的要求。如果消费者在将消息保存到数据库之前死亡,如果ActiveMQTextMessage.ACKNOWLEDGE(),当消费者重新连接时会重新发送消息;方法没有被调用,正如我所说的,只要代理没有调用这个方法,这个消息就不会被确认,稍后会被重新传递