Spring JMSListener-应该如何处理空的有效载荷?
几个月前,我对这篇文章提出了基本相同的要求:SpringJMS侦听器应如何处理有效负载为空的消息?,但是我得到的只是一个微不足道的评论,暗示我“重写我的监听器以执行我想要的事情”。有效的声明,但在我眼中仍不清楚,因为我仍在使用Spring-
Boot。从那时起我就学会了,并且想更直接地重新提出这个问题(而不是对老问题悬赏)。
我使用@Configuration
和设置了一个带注释的bean类,@EnableJms
我的容器工厂如下所示:
@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
然后将传入的消息转换为字符串。所以我的听众现在看起来像
@JmsListenerpublic void processOrder(Message message) throws JMSException {
String convertedMessage = ((TextMessage) message).getText();
:
:
}
这可能会引发JMSException,但是我现在对此并不十分担心,因为现在ErrorHandler
调用实现的类时,我现在知道原因,并且可以做更具体的事情来处理失败的转换。这正是我需要的。
编辑:响应Jonh K的建议,听众不喜欢将其byte[]
作为参数。它基本上希望转换器将字节数组转换为字符串。选择不实施我自己的自定义转换器。
以上是 Spring JMSListener-应该如何处理空的有效载荷? 的全部内容, 来源链接: utcz.com/qa/402749.html