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);
}
}
当我更改传入消息的结构并且无法再处理旧消息时,我们遇到了这种情况。
我想处理队列中具有特定格式且可以反序列化为特定格式的消息 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);
}
}
当我更改传入消息的结构并且无法再处理旧消息时,我们遇到了这种情况。