2016-08-04 1 views
4

나는이 게시물을 통해 몇 달 전에 기본적으로 같은 질문을했다 : How should a Spring JMS listener handle a message with an empty payload?,하지만 나는 내가 원하는 것을하기 위해 내 청취자를 다시 쓰는 것을 제안하는 희박한 의견이었다. 유효한 진술이지만, 아직도 봄 - 부트를 이해할 때 눈에 잘 띄지 않습니다. 나는 그때부터 배웠으며이 질문에 대해 직접적으로 다시 물어보고 싶습니다 (이전 것에 현상금을내는 것과 반대).Spring JMSListener - 빈 페이로드를 어떻게 처리해야합니까?

나는 @Configuration@EnableJms와 주석 빈 클래스를 설정하고 내 컨테이너 공장과 같이 보인다 :

@Bean 
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
     DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
     factory.setConnectionFactory(mqConnectionFactory()); 
     factory.setDestinationResolver(destinationResolver()); 
     factory.setConcurrency("1"); 
     factory.setErrorHandler(errorHandler()); 
     factory.setSessionTransacted(true); 
     factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); 
     return factory; 
    } 

그리고 리스너는 다음과 같습니다 주석 일단 내가 알고있는 것처럼

@JmsListener(id = "qID", destination = "qName") 
    public void processOrder(String message) {. . .} 

bean 클래스가 실행되면 JMSListener이 기본적으로 시작됩니다 (autoStartup을 false로 설정하지 않은 경우). 그래서 어디서 어떻게 제어 할 수 있는지 이해하지 못합니다. JmsListener 가지를 처리합니다. 내 관점에서 볼 때 "그냥 실행"합니다. 따라서 대기열에 "\n"이 있거나 빈 문자열 만있는 경우 리스너는 예외를 throw합니다. 특히 org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String. 그리고이 예외는 무대 뒤에서 발생합니다. 나는 청취자

내가 SimpleMessageConverter로 보였지만, 나를 setIgnoreStringPattern() 같은 말을 할 수 있도록 할 수있는 모든 작업을 볼 것 같지 않았다 안에 아무것도 실행 할 수있는 기회를 결코 . 그건 분명히 존재하지 않지만 그것이 필요한 것입니다. 내가 뭘 놓치고 있니? JmsListener에 특정 문자열을 무시하도록 지시하는 방법이 있습니까?

+0

빈 메시지를 지원해야하는 이유에 대해 좀 더 설명 할 수 있습니까? –

+0

@ JohnK. 따라서 우리는 다른 응용 프로그램이 작성하는 IBM WebSphere MQ 대기열이 있습니다. 청취자는 오류 대기열을 계속 확인해야합니다. 오류 대기열에는 매우 이상한 메시지가 들어 있습니다. 내 애플 리케이션은 쓸모없는 메시지를 식별함으로써 그것을 해결하기위한 것입니다. 가져서는 안되는 대기열에 들어가는 개행 문자와 같습니다. –

+0

다른 사람이 대기열에 쓰는 내용을 제어 할 수 있다면 가장 좋은 대답은 다른 응용 프로그램이 유효한 메시지를 작성하는지 확인하는 것입니다. 어떤 경우에 당신이 그들을 통제 할 수 없다면, 신경 쓰지 마라. –

답변

1

필자는 M. Deinum의 제안을 (신속하고 깨끗한 것처럼 보였으므로) 간단히 매개 변수 유형을 javax.jms.Message으로 변경 한 다음 들어오는 메시지를 문자열로 변환했습니다. 그래서 내 리스너 지금 JMS 프로 바이더를 던질 수

@JmsListener 
public void processOrder(Message message) throws JMSException { 
    String convertedMessage = ((TextMessage) message).getText(); 
    : 
    : 
} 

이처럼 보이는,하지만 지금처럼 내 구현 ErrorHandler 클래스를 호출 할 때 너무 걱정하지 않아요, 지금은 이유를 알 수 및 더 구체적인 뭔가를 할 수 실패한 변환을 처리합니다. 이것은 내가 필요한 것입니다.

편집 : Jonh K의 제안에 따라 청취자는 byte[]을 매개 변수로 사용하는 것을 좋아하지 않았습니다. 그것은 기본적으로 바이트 배열에서 문자열로 변환하는 변환기를 원했습니다. 내 자신의 사용자 지정 변환기를 구현하지 않도록 선택했습니다.

0

수신기 컨테이너 팩토리에 사용자 지정 메시지 변환기를 추가하고 수신 메시지로 원하는 모든 작업을 수행 할 수 있습니다.

+0

이것을 읽으면 "custom"이라는 단어가 나에게 두드러진다. 당신은 말 그대로'Simple MessageConverter'와 같은 것을 사용하거나 수정하는 대신 내 자신의 것을 쓰는 것을 의미합니까? –

+0

SMC를 하위 클래스로 만들거나 위임 할 수 있으며 사용자 지정 논리를 추가 할 수 있습니다. –