当前位置: 首页 > 知识库问答 >
问题:

Spring JMS和ActiveMQ的同步问题

姜奇
2023-03-14

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

这就是我所做的

>

  • 创建一个spring应用程序,该应用程序可以通过队列通过activemq/tomcat/jndi发送和接收JMS消息。我将@transaction放入onmessage()方法(应该在JPA中工作,但在本示例中可能不工作)。sender方法用@Scheule注释,每5秒运行一次,并向队列发送10条消息。有一个全局计数器来计算正在发送的消息总数。

    部署这个应用程序的三个实例,一个同时打开发送者和接收者,另外两个只激活接收者。因此,所有三个接收者将把消息写入相同的文本文件(作为一个小型数据库工作),这样每个接收者都将在写入后关闭该文件。

    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}
    

  • 共有1个答案

    苏畅
    2023-03-14

    不可能在多个接收者中保持严格的排序(或者在单个接收者上并发>1)。

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

     类似资料:
    • 我在Java写程序,有点担心同步。 这个场景非常“简单”,我们有一个简单的银行账户类,多人可以从账户中取款(虽然他们不能存款),他们也可以检查账户余额。问题是,余额一直在变化,因此我们希望客户查看正确的余额! 到目前为止,这是我的班级。 正如您可以看到的,通过这个实现,我可以确保有人可以从一个account对象获得资金,但是这个account对象被阻止了,然后一个解决方案出现了 添加这似乎解决了我

    • 我安装了Android Studio 3.4,在同步gradle时遇到了这个问题。我到处都找不到解决问题的办法。 以下是我收到的错误: “无法解析:com.android。支持:appcompat-v7:28.0.0在项目结构对话框中显示受影响的模块:app” “无法解析:com.android.support。约束:约束布局:1.1.3在项目结构对话框中显示受影响的模块:应用程序” “无法解析:

    • 本文向大家介绍Spring注解和同步锁不能同步问题解决,包括了Spring注解和同步锁不能同步问题解决的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring注解和同步锁不能同步问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 结论:如果在service层的方法上同时使用事务和同步锁无法保证数据同步。 上面这个例子无法保证数

    • 问题内容: 我面临pthread的同步问题。threadWaitFunction1,是线程等待函数。我希望行号。仅在243-246完成后才执行247 。但我感到奇怪的是,有时它会在243-246完成之前直接跳到247。 请帮我。 提前致谢。 创建并调用上述线程的线程是: 如果我使用pthread_mutex_lock保护整个函数,但仍然存在相同的问题。 如何确保有序执行?有人可以帮忙吗? 编辑:n

    • 问题内容: Java文档说“同一对象上的同步方法的两次调用不可能交错”。我需要知道的是,synchronized是否还会阻止 同一类的 两个不同 实例中的 同步方法交织。 例如,类Worker具有称为process()的方法。我们有几个在自己的线程中运行的Worker实例。我们希望防止多个实例同时运行process()方法。会 同步 吗? 谢谢。 问题答案: 没有; 仅防止多个线程在 同一 实例中

    • 我使用的是Apache ActiveMQ Artemis 2.16.0(但也尝试了2.15.0)、artemis-jms-client 2.6.4和Spring Boot 1.5.16.release。