我希望在具有特定格式的队列中处理消息,并且可以将其反序列化为某个Java类。为此,我创建了以下方法。
@JmsListener(destination = "myQueue", containerFactory = "myFactory")
public void receiveMessage(Message message) {
service.process(message);
}
但是,当消息无法反序列化为Message类的实例,并且我得到org.springframework.messaging.converter.MessageConversionException
时,我想处理该异常并记录消息的内容。这样做的标准方法是什么?是否有任何注释来定义方法?
答案 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);
}
}
当我更改传入消息的结构并且旧消息无法再处理时,我们遇到了这种情况。