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

时间:2016-08-04 16:53:15

标签: java spring-boot spring-jms

几个月前我用这篇文章基本上问了同样的事情: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忽略某些字符串?

3 个答案:

答案 0 :(得分:2)

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

2019-2020年春季版本

答案 1 :(得分:1)

我接受了M. Deinum的建议(因为它看似快速而干净)并简单地使参数类型SELECT DISTINCT `userid`,`url`, FROM_UNIXTIME(`time`,'%Y-%m-%d') as date,count(`userid`) as usercount FROM `mdl_log` GROUP BY FROM_UNIXTIME(`time`,'%Y-%m-%d') 然后将传入的消息转换为字符串。所以我的听众现在看起来像

javax.jms.Message

这可能会抛出一个JMSException,但我现在不太关心那个,当我调用我的实现的@JmsListener public void processOrder(Message message) throws JMSException { String convertedMessage = ((TextMessage) message).getText(); : : } 类时,我现在知道为什么并且可以做一些更具体的事情来处理转换失败。这正是我所需要的。

编辑:在回应Jonh K的建议时,听众不喜欢将ErrorHandler作为参数。它基本上希望转换器从字节数组转换为字符串。选择不使用我自己的自定义转换器。

答案 2 :(得分:0)

您可以将自定义消息转换器添加到侦听器容器工厂,并使用传入消息执行任何操作。