一个 JMS 消费者停止监听活动的 mq 主题,而第二个没有

Posted

技术标签:

【中文标题】一个 JMS 消费者停止监听活动的 mq 主题,而第二个没有【英文标题】:One JMS Consumer stops listening active mq topic while second do not 【发布时间】:2015-01-19 09:00:20 【问题描述】:

在我的项目中,弹簧石英工艺每 15 分钟运行一次,即每天运行 96 次。这会从数据库中获取某些记录并将其发布到 REST 服务(在 JBoss 7 上运行)。这些记录一般有 50 到 100 条。

在 REST 服务上,有 jms 事件发布者在主题上发布此消息。这个话题有两个消费者。

    处理消息并在移动设备上发送推送通知消息 与第三方通话(通常需要 4 到 5 秒才能完成通话)

由于它是主题,因此两个消费者都会收到所有消息,但他们会根据某些属性将它们过滤掉,因此很少有消息由一个消费者处理,而由另一个消费者休息。

我的问题是;这是最近一周以来观察到的;消费者 #1 多次收到来自 APNS 的响应作为无效令牌;令牌用于向手机发送推送通知;一段时间后,这个消费者停止并且根本没有响应,而第二个消费者继续运行。

以下是配置:

  <amq:broker id="broker" useJmx="false" persistent="false">
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://localhost:0"/>
    </amq:transportConnectors>
  </amq:broker>

  <!-- ActiveMQ Destination -->
  <amq:topic id="topicName" physicalName="topicPhysicalName"/>

  <!-- JMS ConnectionFactory to use, configuring the embedded broker using XML -->
  <amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost"/>

  <!-- JMS Producer Configuration -->
  <bean id="jmsProducerConnectionFactory"
        class="org.springframework.jms.connection.SingleConnectionFactory"
        depends-on="broker"
        p:targetConnectionFactory-ref="jmsFactory"/>

  <!-- JMS Templates-->
  <bean id="jmsTemplate"
        class="org.springframework.jms.core.JmsTemplate"
        p:connectionFactory-ref="jmsProducerConnectionFactory"/>

  <!-- Publisher-->
  <bean name="jmsEventPublisher"
        class="com.jhi.mhm.services.event.jms.publisher.JMSEventPublisher">
    <property name="jmsTemplate" ref="jmsTemplate"/>
    <property name="topic">
      <map>
        <entry key="keyname" value-ref="topicName"/>
      </map>
    </property>
  </bean>

  <!-- JMS Consumer Configuration -->
  <bean name="consumer2" class="Consumer2"/>
  <bean name="consumer1" class="Consumer1"/>

  <bean id="jmsConsumerConnectionFactory"
        class="org.springframework.jms.connection.SingleConnectionFactory"
        depends-on="broker"
        p:targetConnectionFactory-ref="jmsFactory"/>

  <jms:listener-container container-type="default"
                          connection-factory="jmsConsumerConnectionFactory"
                          acknowledge="auto"
                          destination-type="topic">

    <jms:listener destination="topicPhysicalName" ref="consumer1"/>
    <jms:listener destination="topicPhysicalName" ref="consumer2"/>

  </jms:listener-container>

我搜索了另一个发布的问题,但找不到任何相关内容。 你的想法会很有帮助的。

【问题讨论】:

ActiveMQ 5.7版 我找不到解决办法,所以我改变了方法,如果有人找到答案,欢迎分享。 【参考方案1】:

shailu - 我遇到了类似的问题。我们所做的是升级 MQ 的版本。虽然这并没有完全解决问题,因为 MQ 显示了随机行为,最后我们只是按照业务逻辑合并了我们的端点和调用目的地

【讨论】:

以上是关于一个 JMS 消费者停止监听活动的 mq 主题,而第二个没有的主要内容,如果未能解决你的问题,请参考以下文章

spring监听与IBM MQ JMS整合

JMS/Active MQ - 代理与消费者重新交付

将最后发送的消息发送给 jms 主题的新消费者

使用spring集成确保jms消费者关闭的正确方法是啥?

Spring Integration JMS 创建 ActiveMQ 队列而不是主题

JMS 之 Active MQ 消息存储