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 的版本
几个月前我用这个 post 问了基本相同的问题:
我使用 @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 的版本