2011-03-16 5 views
2

Spring 3.0.5에서 작성되었으며 JMS를 사용하여 메시지를 교환하는 애플리케이션이있다. 메시지를 수신하는 빈은 jms 네임 스페이스를 사용하여 구성됩니다. 나는이 방법이 더 이상 호출되는 Message 객체를 얻기 위해 수신 방법을 변경할 때이Spring JMS 네임 스페이스를 사용할 때 메소드가 호출되지 않는다.

class MyService { 
    public void receive(String msg) { 
     ... 
    } 
} 

봄의 구성은, 그러나이

<jms:listener-container destination-type="queue"> 
    <jms:listener destination="queue.test" ref="myService" method="receive"/> 
</jms:listener-container> 

모양처럼 클래스 보인다.

class MyService { 
    public void receive(TextMessage msg) { 
     ... 
    } 
} 

나는 난 그냥 MessageListenerAdapter를 사용할 수 있음을 인식하지만 더 많은 구성 오버 헤드와이 작동하지 않는 이유를 난 그냥 궁금입니다.

어떤 통찰력이라도 대단히 감사합니다. 당신이 명시 적를 구성하는 것이 necesarry 아니에요, 그래서

프랭크

답변

3

은 그 messageConverter 속성이 null로 설정해야합니다 메시지를 변환하는 MessageListenerAdapter하지 위해서는한다. 그러나 네임 스페이스 구성을 사용할 때 자동으로 만들어진 기본 메시지 변환기를 사용하지 않도록 설정할 수 없습니다.

AbstractListenerContainerParser의 코드는 <jms:listener-container>message-converter 속성이 설정되지 않았거나 유효한 bean을 가리키는 지 확인합니다. 그렇지 않으면 SimpleMessageAdapter이 인스턴스화됩니다.

내가 문제 그리고

public class NoopMessageConverter implements MessageConverter { 
    @Override 
    public Message toMessage(Object object, Session session) 
     throws JMSException, MessageConversionException { 
     return (Message) object; 
    } 

    @Override 
    public Object fromMessage(Message message) 
     throws JMSException, MessageConversionException { 
     return message; 
    } 
} 

다음과 같이

<bean id="noopMessageConverter" class="NoopMessageConverter"/> 

<jms:listener-container message-converter="noopMessageConverter"> 
    <jms:listener destination="queue.test" ref="myService" method="receive"/> 
</jms:listener-container> 

같은 <jms:listener-container> 그런 다음 당신이 당신의 빈을 생성 할 수 있습니다 구성하고 receive를 해결하는 NoopMessageConverter를 만든이 문제를 해결하려면 방법은

class MyService { 
    public void receive(TextMessage msg) { 
     ... 
    } 
} 
3

<jms:listener> 설정은 자동으로 당신을 위해 MessageListenerAdapter을 만듭니다.

MessageListenerAdapter은 코드를 JMS API에서 완전히 분리하도록 설계되었습니다. <jms:listener> 타겟 방법은 메시지의 가능한 페이로드 유형을 나타내는 MessageListenerAdapter 허용하는 유형 파라미터 (docs 참조) 중 하나 String, Serializable, byte[] 또는 Map 즉 하나의 선언해야한다.

원시 JMS TextMessage 객체를 수신하려면 수신기 클래스는 MessageListener 또는 SessionAwareMessageListener을 구현해야합니다. 따라서 "적절한"JMS Listener가됩니다. 이 경우, method 설정이 중복되고, 당신은 사용할 수 있습니다

<jms:listener destination="queue.test" ref="myService"/> 

나는 실제로 당신의 receive 방법이 잘못된 매개 변수 유형을 남겼 때 봄이 예외를 발생하지 않았다 오히려 놀랍군요. 내가 알아 낸 것 무엇

+1

라고합니다. 'MessageListenerAdapter'가 원시'Message' 객체를 기대하는 메소드를 완벽하게 호출 할 수 있다는 것입니다. 문서에는'DefaultTextMessageDelegate' 예제가 들어 있습니다. 필자의 경우에는 메시지 속성에 액세스 할 수 있어야합니다. 'MessageListener' 인터페이스를 구현한다는 것은 해당 클래스에 하나의 메소드 만 가질 수 있다는 것을 의미합니다. 그러면 여러 큐에서 들어오는 메시지를 다른 메소드로 전달해야합니다. – magiconair

+0

@magiconair : 음, 잘 보였다. 나는 교정했다. – skaffman

+0

''는 디폴트'MessageListenerAdapter'를 설정 합니다만 원시 메시지를 얻기 위해서는 메시지 변환기를'null'으로 설정하여 내용 추출을 비활성화해야 할 수도 있습니다. 그러나, 그것은' '로는 불가능한 것처럼 보입니다. – magiconair

관련 문제