2014-10-19 4 views
0

JBoss를 시작할 때 JMS Listener 오류 메시지가 표시됩니다. 두 명의 가입자가있는 주제를 설정하려면 Spring을 사용하고 있습니다. 여기 내 설정이다 :JMS에서 이상한 오류가 발생했습니다.

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

보스를 다시 시작했을 때 나는 보스 내 주제에 대해 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 초마다 영원히 계속됩니다. AbstractListener 방법 이름에 문제가 될 것 같다

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

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

:

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

이 클래스의 간단한 표현은 다음과 같습니다

내 OrderListener 및 OfferListener 모두 동일한 슈퍼 클래스를 확장합니다. 해결 솔루션

내가 할 수있는 문제 나 각 청취자에 대한 고유 마커 인터페이스를 정의하는 경우이 방법 uniquly과 같이 각 각 청취자를 식별 soem에 대한 :

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

모두 OfferListenerMarkerOrderListenerMarker은 빈 인터페이스. 이 기술은 내 문제를 해결하지만 추한 것이고 왜 그 이유는 모르겠다. 이 문제는 고유 한 ID를 가져야하는 JMS 항목 수신기와 관련이있는 것으로 보입니다. 나는 클래스 자체 (OrderListener와 OfferListener)가 둘 다 동일한 추상 클래스를 확장하더라도 고유 한 신원이라고 생각했다.

마커 인터페이스를 없애기 위해 내가 할 수있는 주제 설정에 뭔가가 있습니까?

이 스레드를 읽어 주셔서 감사합니다. 고유 가입 이름

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

을 제공

+0

왜 'MessageListenerAdapter'로 포장합니까? 그럴 필요가 없어야합니다 (문제가 생길 수 있습니다). –

+0

'MessageListenerAdapter'는 래퍼 클래스로 확장되거나 사용될 수 있습니다. 기본 메시지 메서드는 동일한 개체의 일부인 경우에는 호출되지 않는 특성이 있으므로 래퍼로 사용해야합니다. – DhafirNz

+0

그건 중요하지 않아야합니다 (그러면 내가 다른 뭔가 잘못되었다고 생각하게됩니다). 당신은 문제없이 자신의 클래스 인스턴스를 참조 할 수 있어야한다. (이미 'MessageListener'인 설정으로 판단해라.) –

답변

0

봅니다 기본적으로 JMS 프로 바이더가이 명 가입을 구별 할 수 있어야 영구 가입을 추적 할 수 있습니다.

관련 문제