【问题标题】:Generic handler for MessageConversionExceptionMessageConversionException 的通用处理程序
【发布时间】:2020-01-28 22:02:38
【问题描述】:

当消息具有某种格式并且可以反序列化为某个 Java 类时,我想处理来自队列的消息。为此,我创建了以下方法。

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

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

【问题讨论】:

    标签: java spring jms spring-jms


    【解决方案1】:

    您可以将自定义 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())

    【讨论】:

    • 非常感谢@Gary,有没有办法从处理程序访问消息内容?
    • 我不相信转换异常有对原始消息的引用;我认为您必须自己包装消息转换器,捕获异常并以Message 作为属性抛出一个新异常。
    • 优秀。谢谢!
    【解决方案2】:

    我遇到了同样的问题,添加 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);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多