Search code examples
springjmsactivemq-classicconsumerjms-topic

One JMS Consumer stops listening active mq topic while second do not


A spring quartz process runs every 15 minutes in my project i.e 96 times a day. This fetch certain records from database and POST it on a REST service (running on JBoss 7). These records are in general 50 to 100 in count.

On REST service there is jms event publisher that publishes this message on a topic. There are two consumers on this topic.

  1. That process message and sends push notification messages on mobile
  2. Talk to third party (generally takes 4 to 5 second to complete the call)

Since it is topic both consumers receive all messages but they filter them out based on some property, so few messages are processed by one and rest by another consumer.

My problem is; which is being observed recently since a week time; that consumer #1 receives response from APNS as invalid token multiple times; token is used to send push notification to mobile; after some time this consumer stops and do not respond at all while second one keeps running.

Below are configurations:

  <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>

I search another posted questions but could not find anything related. Your thoughts would be really helpful.


Solution

  • shailu - I went through similar problem. What we did is upgrade the version of MQ. Although this did not solved the problem completely as MQ shows random behavior and at the end we simply merged our endpoint and call destination as per biz logic