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

标签 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 忽略某些字符串?

最佳答案

我采纳了 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/

相关文章:

java - Spring Cloud 与 WSO2 API 管理器

jms - 如何在启动时以编程方式禁用 Spring @JmsListener

java - 什么是 Spring JMS 中的 JmsTemplate 回调?

java - 如何在 Java 中正确编写 unicode 名字的正则表达式?

java - Java EE 中的 Unicode 并将问号保存在数据库中

Spring Neo4j不保存数据

java - Spring WebServiceTemplate 的 marshalSendAndReceive 方法在发送 Request 时将 SOAP header 发送为 null

java - Spring JMS 监听器中的事务管理

java - java中具有多个客户端的网络服务器

java - 在Mac OS X上安装Hadoop