2017-01-04 6 views
0

메시지 처리를 위해 Spring amqp MessageListener 구현을 사용하고 있습니다. Bean 정의와 작업 예제는 다음과 같습니다.재시도 대기열에 메시지를 보관하여 처리 할 때까지

public class AutomationMessageListenerServiceImpl implements MessageListener { 

public void onMessage(Message message) { 
     EntityMessage message= null; 
     try { 
      message= jsonDeserializer.covertPayload(message.getBody()); 
      dispatchToHandler(message); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 





<rabbit:listener-container connection-factory="rabbitConnectionFactory"> 
     <rabbit:listener queue-names="${listen.queue}" ref="messageListener"/> 
    </rabbit:listener-container> 

    <bean id="messageListener" class="com.tcl.gvg.itsm.automation.core.messaging.AutomationMessageListenerServiceImpl"/> 

여기 문제는 catch 블록의 모든 오류를 처리하므로 큐가 성공적으로 메시지를 처리했다고 생각합니다. 그러나 오류가 발생하지 않으면 상위 인터페이스에서 문제가 발생하므로 예외를 throw 할 수 없습니다.

직접 코드를 많이 변경하지 않고도이 작업을 수행 할 수 있습니까?

+0

는 메시지가 관리자가 작업을 수행 할 때까지 대기열에 보관하지만이의 onMessage() 계약 방법 나던을 가지고 위의 코드 –

답변

0

RuntimeException을 사용하여 예외를 래핑하고 호출자에게 던집니다. 내가 잘못된 JSON을 보내 예를 들어

catch (Exception e) { 
      throw new RuntimeException(e); 
} 
1

부모 방법은 컨테이너는 onMessage() 통화와 다른 코드가 포함되지 않은 문제를

가 발생할 수 있기 때문에 당신이

무슨 뜻인지 분명하지 않다. 어쨌든, 재구성 한 경우에도 메시지는 즉시 재전송됩니다.

JSON과 같이 치명적인 오류가 발생하는 경우 데드 레터 교환/대기열을 설정하고 을 던져서 메시지를 라우팅해야합니다.

또는 RabbitTemplate을 사용하여 잘못된 메시지를 DLQ에 보내십시오.

+0

MessageListener 인터페이스의 경우이 아니다되어 있어야합니다 예외를 던집니다. 그래서 나는 메시지가 확인되는 것을 막기 위해 RuntimeException을 던져야 만했다. –

+0

맞다. –