我在啓動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 {...}
兩個OfferListenerMarker
和OrderListenerMarker
是空的接口。這種技術解決了我的問題,但它很醜,我不明白爲什麼。 這個問題似乎與JMS主題監聽器必須具有唯一標識有關。我認爲類本身(OrderListener和OfferListener)是一個獨特的身份,即使它們都擴展了相同的抽象類。
我試圖找到擺脫標記界面,有mus我的主題設置中可以做的東西?
感謝您閱讀本主題。
爲什麼你將它們包裝在'MessageListenerAdapter'中?這不應該需要(可能是你遇到麻煩的原因)。 – 2014-10-19 19:01:19
'MessageListenerAdapter'可以擴展或用作包裝類。我需要使用它作爲包裝,因爲默認的消息方法有一個方面,如果它是同一個對象的一部分,將不會被調用。 – DhafirNz 2014-10-20 18:10:17
這應該不重要(這使我相信有其他錯誤)。你應該不需要它,你應該能夠毫無問題地引用你自己的類實例(從你的配置判斷已經是'MessageListener'。 – 2014-10-20 18:13:43