【问题标题】:Listener method not called when using Spring JMS使用 Spring JMS 时未调用侦听器方法
【发布时间】:2016-12-20 16:00:54
【问题描述】:

我有一个基于 Spring 4.1 构建的应用程序。我正在尝试使用 XML 配置创建 JMS 侦听器,并尝试将传入的 XML 消息转换为 Java 对象。下面是我的xml配置:

<jms:listener-container concurrency="10"
    connection-factory="connectionFactory"
    message-converter="marshallingMessageConverter">
    <jms:listener destination="destination.name" ref="messageListener" method="processMessage"/>
</jms:listener-container>

<bean id="messageListener" class="com.example.CustomMessageListener">
</bean>

<bean id="marshallingMessageConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter">
        <property name="marshaller" ref="xmlMarshaller"/>
        <property name="unmarshaller" ref="xmlMarshaller"/>
</bean>

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound" value="com.example.CustomObject"/>
</bean>

com.example.CustomMessageListener 类如下所示:

public class CustomMessageListener{
    public void processMessage(Message message, CustomObject object){
        //Do Something.
    }

现在,当我将消息发布到目标队列时,侦听器上的方法 processMessage() 没有被调用,并且我在 spring 日志中收到以下错误:

Failed to invoke target method 'processMessage' with arguments {com.example.CustomObject@52ee271d}; 
nested exception is java.lang.NoSuchMethodException:
com.example.CustomMessageListener.processMessage(com.example.CustomObject).

现在,如果我将 Listerner 方法的参数更改为只接受 CustomObject,它会起作用,并且我会从 XML 中正确构造 CustomObject:

public void processMessage(CustomObject, object)

但我还需要原始的javax.jms.Message 实例,根据this 文档,应该可以通过在参数列表中指定它来接收该实例。

有人可以帮我吗?

【问题讨论】:

  • 是的,这是可能的,但是如果您查看的是针对监听器的注释版本而不是 XML 定义的监听器版本的文档。

标签: spring spring-jms


【解决方案1】:

试试这个应该可以的

<jms:listener-container concurrency="10"   connection-factory="connectionFactory" >
    <jms:listener destination="destination.name" ref="defaultMessageListener"  />
</jms:listener-container>

<bean id="messageListener" class="com.example.CustomMessageListener">
</bean>

<bean id="marshallingMessageConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter">
        <property name="marshaller" ref="xmlMarshaller"/>
        <property name="unmarshaller" ref="xmlMarshaller"/>
</bean>

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound" value="com.example.CustomObject"/>
</bean>

<bean id="payloadArgumentResolver" class="org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver">
    <property name="converter" ref="marshallingMessageConverter"/>
</bean>

<bean id="handlerMethod" class="org.springframework.messaging.handler.invocation.InvocableHandlerMethod">
    <constructor-arg
        ref="messageListener" index="0"/>
    <constructor-arg
        value="processMessage" index="1"/>
    <constructor-arg
        value="javax.jms.Message"  type="java.lang.Class" index="2"/>
    <constructor-arg
        value="com.example.CustomObject"  type="java.lang.Class" index="3"/>
    <property name="argumentResolvers" ref="payloadArgumentResolver"   />
</bean>

<bean id="defaultMessageListener" class="org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter">
    <property name="handlerMethod" ref="handlerMethod"   />
</bean>

【讨论】:

  • 不。我得到了同样的错误。我需要使用 MessageHandlerMethodFactory 吗?即使上述文件没有说它是强制性的;但有人提到它。我不知道如何使用它。
  • 如评论中所述,该文档适用于@JmsListener,不适用于 XML 驱动版本。
  • @M.Deinum 好的。 This 是我想要遵循的,我觉得可以达到与注释相同的效果。有没有办法使用 XML 配置来实现它?
  • 没有。它只接受消息类型(使用编组器时)或Message,而不是两者。如果需要,您将不得不使用注释驱动方式。
  • 我添加了一个 xml 可能性,我过去使用过这个但没有添加一个新的 argumentResolvers ,这个例子是用 PayloadArgumentResolver 完成的
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2012-07-09
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多