Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MessageConversionException的通用处理程序_Java_Spring_Jms_Spring Jms - Fatal编程技术网

Java MessageConversionException的通用处理程序

Java MessageConversionException的通用处理程序,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,当队列中的消息具有特定格式并且可以反序列化为特定Java类时,我希望处理这些消息。为此,我创建了以下方法 @JmsListener(destination = "myQueue", containerFactory = "myFactory") public void receiveMessage(Message message) { service.process(message); } 但是,当消息无法反序列化到Message类的实例时,我会得到一个org.springframew

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

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

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

您可以向侦听器容器工厂添加自定义的
ErrorHandler
——请参阅


Add
factory.setErrorHandler(myErrorHandler())
我也有同样的问题,添加
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);
    }
}

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

非常感谢@Gary,有没有办法从处理程序访问消息内容?我不相信转换异常引用了原始消息;我认为您必须自己包装消息转换器,捕获异常并抛出一个新异常,将
消息作为属性。非常好。谢谢
@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);
    }
}