MessageConversionException 的通用处理程序

Generic handler for MessageConversionException

我想处理队列中具有特定格式且可以反序列化为特定格式的消息 Java class。为此,我创建了以下方法。

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

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

您可以向侦听器容器工厂添加自定义 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()).

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

但是,我没有解开 "on the fly" 绑定的 @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);
    }
}

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