我正在使用Spring JMS和ActiveMQ通过JNDI/Tomcat实现一个简单的演示。总的目的是有一个发送方和多个接收方,但是队列中的消息必须同步操作,这意味着无论所有消息的接收方都应该按照原始发送顺序处理多少个。
这就是我所做的
@Transactional放到了onMessage()方法中(应该在JPA中工作,但在这个示例中可能不行)。发送方方法使用@Scheule进行注释,每5秒运行一次,并向队列发送10条消息。有一个全局计数器来计算正在发送的总消息。text file(作为一个小型数据库工作),以便每个接收方在编写完文件后都会关闭该文件。这是我得到的结果
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(0)=messageBody1}
Mon Nov 24 13:57:00 EST 2014 Receiver 0 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(1)=messageBody2}
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(2)=messageBody3}
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(3)=messageBody4}
Mon Nov 24 13:57:00 EST 2014 Receiver 0 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(4)=messageBody5}
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(5)=messageBody6}
Mon Nov 24 13:57:00 EST 2014 Receiver 0 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(6)=messageBody7}
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(7)=messageBody8}
Mon Nov 24 13:57:00 EST 2014 Receiver 0 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(8)=messageBody9}
Mon Nov 24 13:57:00 EST 2014 Receiver 1 {from Sender agent..message_aj9gg95q1kmb77i8506bcn3dpp(9)=messageBody10}
Mon Nov 24 13:57:05 EST 2014 Receiver 1 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(0)=messageBody11}
Mon Nov 24 13:57:05 EST 2014 Receiver 0 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(1)=messageBody12}
Mon Nov 24 13:57:05 EST 2014 Receiver 0 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(2)=messageBody13}
Mon Nov 24 13:57:05 EST 2014 Receiver 1 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(3)=messageBody14}
Mon Nov 24 13:57:05 EST 2014 Receiver 0 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(4)=messageBody15}
Mon Nov 24 13:57:05 EST 2014 Receiver 1 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(5)=messageBody16}
Mon Nov 24 13:57:05 EST 2014 Receiver 1 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(6)=messageBody17}
Mon Nov 24 13:57:05 EST 2014 Receiver 1 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(8)=messageBody19} ----- oops
Mon Nov 24 13:57:05 EST 2014 Receiver 2 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(7)=messageBody18} ----- oops
Mon Nov 24 13:57:05 EST 2014 Receiver 0 {from Sender agent..message_n7ofp65ioqcfhdl63cjg76e4fb(9)=messageBody20}显然,从messageBody 18和19 (请向右滚动),它们破坏了同步(消息18应该在消息19之前传递)。我想知道这是ActiveMQ的一些随机情况,还是可能是设置中的一些潜在问题,或者,它可能是写在文本文件中的,所以如果它在真实的数据库中,那么@Transactional就可以保证同步
发布于 2014-11-24 22:59:01
对于多个接收方,不可能保持严格的排序(或者单个接收方的并发性>1)。
消费者正在争夺信息,这只是一场比赛,决定谁先处理下一条消息。操作系统可能在收到消息后,但在写入文件之前,将线程从CPU中踢出,而“下一个”使用者可能会端到端地处理整个事件。即使使用多核CPU,也可能发生这种情况。
https://stackoverflow.com/questions/27115101
复制相似问题