Spring JMSListener - 它应该如何处理空负载?

Spring JMSListener - How should it handle empty payloads?

几个月前我用这个 post 问了基本相同的问题:,但我得到的只是一条微不足道的评论,暗示我 "re-write my listener to do what I want"。有效的声明,但在我看来还不清楚,因为我仍在掌握 Spring-Boot.从那时起我就学会了,想更直接地重新问这个问题(而不是悬赏旧问题)。

我使用 @Configuration@EnableJms 设置了带注释的 bean class,我的容器工厂如下所示:

@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 class 通过 运行,JMSListener 基本上就会开始(除非我将 autoStartup 设置为 false),所以我无法理解我何时何地可以控制 JmsListener 处理事情的内容或方式。从我的角度来看它 "just runs"。因此,如果队列上有 "\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 class 被调用时,我现在知道为什么并且可以做一些更具体的事情处理失败的转换。这正是我需要的。

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

@JmsListener(destination = "stompmessage")
public void receiveStomp(byte[] data, @Headers Map<Object, Object> allHeaders) {
   System.out.println("Stomp message: "+ new String(data));
}

2019-2020 年 spring 的版本