首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring和ActiveMQ的同步问题

Spring和ActiveMQ的同步问题
EN

Stack Overflow用户
提问于 2014-11-24 22:08:37
回答 1查看 497关注 0票数 0

我正在使用Spring JMSActiveMQ通过JNDI/Tomcat实现一个简单的演示。总的目的是有一个发送方和多个接收方,但是队列中的消息必须同步操作,这意味着无论所有消息的接收方都应该按照原始发送顺序处理多少个。

这就是我所做的

  1. 创建一个spring应用程序,它可以通过ActiveMQ/Tomcat/JNDI通过队列发送和接收JMS消息。我把@Transactional放到了onMessage()方法中(应该在JPA中工作,但在这个示例中可能不行)。发送方方法使用@Scheule进行注释,每5秒运行一次,并向队列发送10条消息。有一个全局计数器来计算正在发送的总消息。
  2. 部署该应用程序的三个实例,一个同时打开发送方和接收方,另两个只激活接收方。因此,所有三个接收方都会将消息写入同一个text file(作为一个小型数据库工作),以便每个接收方在编写完文件后都会关闭该文件。
  3. 在默认情况下,我没有以同步方式更改ActiveMQ和Spring的任何同步设置。

这是我得到的结果

代码语言:javascript
复制
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就可以保证同步

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-24 22:59:01

对于多个接收方,不可能保持严格的排序(或者单个接收方的并发性>1)。

消费者正在争夺信息,这只是一场比赛,决定谁先处理下一条消息。操作系统可能在收到消息后,但在写入文件之前,将线程从CPU中踢出,而“下一个”使用者可能会端到端地处理整个事件。即使使用多核CPU,也可能发生这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27115101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档