使用Spring在JMS主题设置中出现奇怪错误

时间:2014-10-19 18:52:06

标签: java spring jms

启动JBoss时,我收到JMS侦听器失败错误消息。 我正在使用Spring设置一个有两个订阅者的主题。 这是我的设置:

<bean id="offerListner" 
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
    <constructor-arg>
        <bean class="com.me.OfferListener" />
    </constructor-arg>
</bean>

<bean id="orderListener"
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
    <constructor-arg>
        <bean class="com.me.OrderListener" />
    </constructor-arg>
</bean>


<jms:listener-container  connection-factory="connectionFactory" acknowledge="transacted"  cache="connection" client-id="1" destination-type="durableTopic" >
    <jms:listener destination="eventTopic" ref="offerListener" />
    <jms:listener destination="eventTopic" ref="orderListener" />
</jms:listener-container>

当重新启动JBoss时,我得到一个错误消息模式,表明JBoss正在努力初始化我的主题的JMS监听器&gt;这是我得到的信息:

2014-10-20 07:20:33,747 INFO  [STDOUT] (A2-2) 07:20:33,747  WARN DefaultMessageListenerContainer:842 - Setup of JMS message listener invoker failed for destination 'eventTopic' - trying to recover. Cause: Cannot create a subscriber on the durable subscription since it already has subscriber(s)

2014-10-20 07:20:33,747 INFO  [STDOUT] (A2-2) 07:20:33,747  INFO DefaultMessageListenerContainer:891 - Successfully refreshed JMS Connection

2014-10-20 07:20:38,754 INFO  [STDOUT] (A2-3) 07:20:38,754  WARN DefaultMessageListenerContainer:842 - Setup of JMS message listener invoker failed for destination 'eventTopic' - trying to recover. Cause: Cannot create a subscriber on the durable subscription since it already has subscriber(s)

... 并且消息每5秒钟就会消失一次。

我的OrderListener和OfferListener都扩展了相同的超类:

public class OfferListener extends AbstractListener {...}
public class OrderListener extends AbstractListener {...}

这是类的简单表示:

public abstract class AbstractListener<T> {
      abstract protected void handleMessage(T message);

      @RunAsAdmin
      public void onMessage(Message message) {
        // pre-process the message, 
        handleMessage( processedMessage ); 
      }
}

AbstractListener方法名称中似乎存在问题。 变通方法解决方案

如果我为每个监听器定义一个唯一的标记接口,我就可以解决这个问题,这对于如何正确地识别每个监听器,如下所示:

public class OfferListener extends AbstractListener implements OfferListenerMarker {...}
public class OrderListener extends AbstractListener implements OrderListenerMarker {...}

OfferListenerMarkerOrderListenerMarker都是空接口。这种技术解决了我的问题,但它很难看,我不明白为什么。 该问题似乎与JMS主题监听器必须具有唯一标识有关。我认为类本身(OrderListener和OfferListener)是一个唯一的标识,即使它们都扩展了相同的抽象类。

我试图找到摆脱标记界面,在主题设置中我可以做些什么?

感谢您阅读此主题。

1 个答案:

答案 0 :(得分:0)

尝试提供唯一的订阅名称

<jms:listener-container  connection-factory="connectionFactory" acknowledge="transacted"  cache="connection" client-id="1" destination-type="durableTopic" >
    <jms:listener destination="eventTopic" ref="offerListener" subscription="xyz" />
    <jms:listener destination="eventTopic" ref="orderListener" subscription="abc" />
</jms:listener-container>

基本上,为了跟踪持久订阅,JMS提供者需要能够区分两个订阅。