我使用@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
忽略某些字符串?
答案 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)
您可以将自定义消息转换器添加到侦听器容器工厂,并使用传入消息执行任何操作。