SpringMot JmsListener на основе AMQP завершается с ошибкой на TextMessage - PullRequest
0 голосов
/ 29 января 2019

У меня есть приложение 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 пока не помогла.

1 Ответ

0 голосов
/ 29 января 2019

Если у вас есть проблема с преобразованием из байта [] в строковое использование:

.convertBodyTo(String.class)

Пример маршрута:

from(QUEUE_URL)
                .routeId("consumer")
                .convertBodyTo(String.class)
                .log("${body}")
                .to("mock:mockRoute");
...