几个月前我在这篇文章中问了基本相同的问题:How should a Spring JMS listener handle a message with an empty payload? ,但我得到的只是一条微不足道的评论,建议我“重写我的听众来做我想做的事”。有效的声明,但在我看来还不清楚,因为我仍在掌握 Spring-Boot。从那时起我就学会了,想更直接地重新问这个问题(而不是悬赏旧问题)。
我使用 @Configuration
和 @EnableJms
设置了带注释的 bean 类,我的容器工厂如下所示:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(mqConnectionFactory());
factory.setDestinationResolver(destinationResolver());
factory.setConcurrency("1");
factory.setErrorHandler(errorHandler());
factory.setSessionTransacted(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
监听器看起来像:
@JmsListener(id = "qID", destination = "qName")
public void processOrder(String message) {. . .}
据我了解,一旦带注释的 bean 类运行完毕,JMSListener
基本上就会启动(除非我将 autoStartup
设置为 false),所以我无法理解我可以控制 JmsListener
处理什么或如何处理事情的时间和地点。从我的角度来看,它“只是运行”。因此,如果队列上有 "\n"
或只有一个空字符串,则监听器将抛出异常。特别是 org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String
。而这个异常是在幕后抛出的。我从来没有机会在监听器中执行任何操作
我查看了 SimpleMessageConverter
,但似乎没有看到任何可以让我说类似 setIgnoreStringPattern()
的东西。那显然不存在,但这就是我所需要的。我错过了什么?有没有办法告诉 JmsListener
忽略某些字符串?
最佳答案
我采纳了 M. Deinum 的建议(因为它看起来又快又干净),只是将参数类型设为 javax.jms.Message
,然后将传入消息转换为字符串。所以我的听众现在看起来像
@JmsListener
public void processOrder(Message message) throws JMSException {
String convertedMessage = ((TextMessage) message).getText();
:
:
}
这可能会抛出一个 JMSException,但我不太关心这个,因为现在当我实现的 ErrorHandler
类被调用时,我现在知道为什么并且可以做一些更具体的事情来处理一个转换失败。这正是我需要的。
编辑:为了响应 Jonh K 的建议,听众不喜欢将 byte[]
作为参数。它基本上想要一个转换器将字节数组转换为字符串。选择不实现我自己的自定义转换器。
关于java - Spring JMSListener - 它应该如何处理空负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773221/