我有一个定义2个JMSListeners的类。 1个侦听器用于客户端从使用JMS的服务器接收的消息MyMessage1
。另一个是MyMessage2
,它由另一个程序生成,不使用JMS(不是java程序)。当我尝试接收此消息时,我会收到一些JMS侦听器异常。它似乎正在使用GenericMessage并尝试将其转换为MyMessage
,尽管有效负载指示它是MyMessage2
,尽管它没有为它指定完整的Java包名称
GenericMessage究竟是什么?这是否表明发件人未正确识别邮件的类型?我是否需要以某种方式为通用消息定义JMSListener并手动序列化,而不是使用JmsListenerContainerFactory
?
@JmsListener()
private void consumeMessage1(final MyMessge1 msg) {
//...
}
@JmsListener()
private void consumeMessage2(final MyMessge2 msg) {
//...
}
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method could not be invoked with incoming message
Endpoint handler details:
Method [private void my.proj.ResultQueueConsumer.consumeMessage1(my.proj.MyMessage1)]
Bean [my.proj.ResultQueueConsumer@24fe9d1]
; nested exception is org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class my.proj.MyMessage1, message=GenericMessage [payload=MyMessage2{attr1='response', version='2.0', attr2='PROJ', attr3='ERROR'}, headers={JMS_AMQP_FirstAcquirer=false, jms_timestamp=0, hostId=my-machine1, requestId=c83b5719-daaa-43f8-9444-b16580d06950, jms_priority=4, jms_messageId=ID:my-machine1-41383-1486390497702-3:127:0:0:1, timestamp=1486391400112, id=33e78ff8-9e7b-1436-ee21-36cacb1ff6b5, JMS_AMQP_MESSAGE_FORMAT=0, jms_deliveryMode=1, jms_redelivered=false, JMS_AMQP_NATIVE=false, jms_destination=queue://Result, sessionId=057907c44eeb18e3940278973a610b2638d198c4, jms_expiration=0}]
答案 0 :(得分:1)
GenericMessage<>
是spring-messaging
个对象。
首先将传入的JMS消息转换为GenericMessage
,然后使用其中的组件调用侦听器;例如,您可以使用方法签名
void foo(@Payload MyMessage2 msh, @Header("foo") int someHeader)
错误消息表明已收到带有MyMessage2
的消息,并且框架正在尝试调用您的第一个侦听器方法。
如果他们都在监听同一个队列,那么该消息将随机转到一个或另一个侦听器,除非您添加selector
并且可以某种方式确定有效负载类型来自标头(用于选择器表达式)。
框架不提供基于有效负载类型路由到特定方法的机制。
不清楚你的意思......
另一个是MyMessage2,它是由另一个程序生成的,而不是使用JMS(不是java程序)。
...因为我们显然能够从消息中构建一个MyMessage2
java对象。