У меня есть приложение Spring Boot, в котором возникают проблемы с получением сообщений JMS типа TextMessage
от посредника ActiveMQ.
Если потребитель пытается получить сообщения от посредника, он не может автоматически преобразовать сообщение в TextMessage, нотрактует это как ByteMessage.Существует JmsListener, который должен читать сообщения из очереди как TextMessage:
...
@JmsListener(destination = "foo")
public void jmsConsumer(TextMessage message) {
...
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
Настоящим производителем является коммерческое приложение, использующее Apache Camel.Следовательно, я вряд ли могу изменить / настроить производителя.Я попытался создать пример производителя, который демонстрирует такое же поведение.
Могу ли я каким-то образом настроить потребителя для обработки сообщения как TextMessage
?
Кроме того: есть ли способ получитьдополнительные свойства AMQP из сообщения программно прямо в Spring?Конечно, я все еще мог прочитать сообщение как ByteMessage
и попытаться разобрать свойства.Но я ищу более чистый путь, который поддерживается любым Spring API.Аннотация Spring @Headers
пока не помогла.