Spring JMSListener-应该如何处理空的有效载荷?

Z. *_*ton 5 java spring-jms spring-boot

几个月前,我在这篇文章中提出了基本相同的要求:Spring JMS侦听器应如何处理有效负载为空的消息?,但是我得到的只是一个微不足道的评论,暗示我“重写我的监听器以执行我想要的事情”。有效的声明,但在我眼中仍不清楚,因为我仍在使用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;
    }
Run Code Online (Sandbox Code Playgroud)

监听器看起来像:

@JmsListener(id = "qID", destination = "qName")
    public void processOrder(String message) {. . .}
Run Code Online (Sandbox Code Playgroud)

据我了解,一旦带注释的Bean类运行完毕,JMSListener基本上就开始了(除非我设置autoStartup为false),所以我无法理解何时何地可以控制什么或如何JmsListener处理事物。在我看来,它“运行”。因此,如果队列上有一个队列"\n"或只有一个空字符串,则侦听器将引发异常。具体来说org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String。而且这个异常被抛在了后面。我从来没有机会在监听器中执行任何操作

我看着SimpleMessageConverter但似乎没有什么可以让我说出类似的话setIgnoreStringPattern()。那显然不存在,但这就是我所需要的。我想念什么?有没有办法告诉JmsListener忽略某些字符串?

Z. *_*ton 3

我采纳了 M. Deinum 的建议(因为它看起来又快又干净),只是简单地设置了参数类型javax.jms.Message,然后将传入的消息转换为字符串。所以我的听众现在看起来像

@JmsListener
public void processOrder(Message message) throws JMSException {
     String convertedMessage = ((TextMessage) message).getText();
     :
     :
}
Run Code Online (Sandbox Code Playgroud)

这可能会引发 JMSException,但我不太关心这一点,因为现在当ErrorHandler调用我实现的类时,我现在会知道原因,并且可以执行更具体的操作来处理失败的转换。这正是我所需要的。

编辑:作为对 Jonh K 的建议的回应,听众不喜欢将其作为byte[]参数。它基本上需要一个转换器来从字节数组转换为字符串。选择不实施我自己的自定义转换器。