我有一个 Spring Boot 应用程序,在检索类型的 JMS 消息时遇到问题TextMessage
来自 ActiveMQ 代理。
如果消费者尝试从代理检索消息,它无法自动将消息转换为 TextMessage,而是将其视为 ByteMessage。有一个 JmsListener 应该从队列中读取消息作为 TextMessage:
...
@JmsListener(destination = "foo")
public void jmsConsumer(TextMessage message) {
...
The JmsListener
产生如下警告,并删除消息:
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method could not be invoked with incoming message
Endpoint handler details:
Method [public void net.aschemann.demo.springboot.jmsconsumer.JmsConsumer.jmsConsumer(javax.jms.TextMessage)]
Bean [net.aschemann.demo.springboot.jmsconsumer.JmsConsumer@4715f07]; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [javax.jms.TextMessage] for org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@7c49d298, failedMessage=org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@7c49d298
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-5.1.4.RELEASE.jar:5.1.4.RELEASE]
我提取了一个小示例应用程序
调试问题:https://github.com/ascheman/springboot-camel-jms https://github.com/ascheman/springboot-camel-jms
现实生活中的生产者是一个使用 Apache Camel 的商业应用程序。因此,我几乎无法更改/定制生产者。我尝试构建一个显示相同行为的示例生成器。
我可以以某种方式调整消费者将消息视为TextMessage
?
此外:有没有办法直接在 Spring 中以编程方式从消息中检索附加的 AMQP 属性?当然,我仍然可以将消息读为ByteMessage
并尝试解析属性。但我正在寻找一种由任何 Spring API 支持的更干净的方法。春天@Headers
到目前为止,注释没有帮助。