2014-10-19 133 views
0

我在啓動JBoss時收到JMS偵聽器失敗錯誤消息。 我正在使用Spring來設置兩個訂戶的主題。 這裏是我的設置: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監聽我的主題模式>這是我得到的消息:

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方法名稱的問題。 的解決方法解決方案

我能問題,如果我定義每個聽者一個獨特的標記接口,這對於SOEM如何uniquly識別每個每個偵聽器,像這樣:

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

兩個OfferListenerMarkerOrderListenerMarker是空的接口。這種技術解決了我的問題,但它很醜,我不明白爲什麼。 這個問題似乎與JMS主題監聽器必須具有唯一標識有關。我認爲類本身(OrderListener和OfferListener)是一個獨特的身份,即使它們都擴展了相同的抽象類。

我試圖找到擺脫標記界面,有mus我的主題設置中可以做的東西?

感謝您閱讀本主題。

+0

爲什麼你將它們包裝在'MessageListenerAdapter'中?這不應該需要(可能是你遇到麻煩的原因)。 – 2014-10-19 19:01:19

+0

'MessageListenerAdapter'可以擴展或用作包裝類。我需要使用它作爲包裝,因爲默認的消息方法有一個方面,如果它是同一個對象的一部分,將不會被調用。 – DhafirNz 2014-10-20 18:10:17

+0

這應該不重要(這使我相信有其他錯誤)。你應該不需要它,你應該能夠毫無問題地引用你自己的類實例(從你的配置判斷已經是'MessageListener'。 – 2014-10-20 18:13:43

回答

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提供者必須能夠在兩個訂閱之間的區別。