启动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 {...}
OfferListenerMarker
和OrderListenerMarker
都是空接口。这种技术解决了我的问题,但它很难看,我不明白为什么。
该问题似乎与JMS主题监听器必须具有唯一标识有关。我认为类本身(OrderListener和OfferListener)是一个唯一的标识,即使它们都扩展了相同的抽象类。
我试图找到摆脱标记界面,在主题设置中我可以做些什么?
感谢您阅读此主题。
答案 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提供者需要能够区分两个订阅。