MessageConversionException的通用处理程序

时间:2017-10-10 12:19:53

标签: java spring jms spring-jms

我希望在具有特定格式的队列中处理消息,并且可以将其反序列化为某个Java类。为此,我创建了以下方法。

@JmsListener(destination = "myQueue", containerFactory = "myFactory")
public void receiveMessage(Message message) {
    service.process(message);
}

但是,当消息无法反序列化为Message类的实例,并且我得到org.springframework.messaging.converter.MessageConversionException时,我想处理该异常并记录消息的内容。这样做的标准方法是什么?是否有任何注释来定义方法?

2 个答案:

答案 0 :(得分:2)

您可以将自定义ErrorHandler添加到侦听器容器工厂 - 请参阅Annotation-driven listener endpoints

@Configuration
@EnableJms
public class AppConfig {

        @Bean
        public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
                DefaultJmsListenerContainerFactory factory =
                                new DefaultJmsListenerContainerFactory();
                factory.setConnectionFactory(connectionFactory());
                factory.setDestinationResolver(destinationResolver());
                factory.setConcurrency("3-10");
                return factory;
        }
}

添加factory.setErrorHandler(myErrorHandler())

答案 1 :(得分:0)

我遇到了同样的问题,添加ErrorHandler并没有帮助我。 JMS队列仍尝试无限期地处理失败的消息。

但是,我不是手动解开绑定的@Payload参数,而是手动将其解组:

@Autowired
private MarshallingMessageConverter xmlMessageConverter;
...

@JmsListener(...)
public void fromQueue(@Payload javax.jms.Message jmsMessage,
                      @Header(value = "UUID", required = false) UUID uuid) {
    try {
        MyCustomeMessage message = (MyCustomeMessage) xmlMessageConverter.fromMessage(jmsMessage);
        // process message ...
    } catch (Exception e) {
        LOGGER.error("Exception in Queue for message uuid [{}]", uuid, e);
    }
}

当我更改传入消息的结构并且旧消息无法再处理时,我们遇到了这种情况。