【问题标题】:Spring Integration and JMS: recieving message from external clientSpring Integration 和 JMS:从外部客户端接收消息
【发布时间】:2013-08-02 08:44:09
【问题描述】:

在我们的系统中,外部客户端将消息放在 JMS 队列中。 我们的 Spring Integration 应用程序需要从这些队列中获取消息并进行处理。 我最初的尝试是使用以下配置:

<int:channel id="source_channel" />

<int-jms:inbound-channel-adapter 
   id="source"
   channel="source_channel"
   destination-name="jms-queue-name"
   connection-factory="...">
   <int:poller fixed-rate="1000" />
</int-jms:inbound-channel-adapter>

<int:service-activator input-channel="source_channel" ref="sourceMessageReciever"/>

我希望服务激活器 bean 在客户端将消息放入“jms-queue-name”队列时处理该消息,但这并没有发生。这是正确的方法,还是我需要使用 messageGateway 来做到这一点? 谢谢,

玫瑰

【问题讨论】:

  • 开启DEBUG日志;一切都应该变得明显;如果您对日志中看到的内容有疑问,请修改您的问题。

标签: spring spring-integration spring-jms


【解决方案1】:

InboundChannelAdapterMessageGateway 之间的区别只是 Adapter 是单向工作而不是双向工作。

我真的不知道可能出了什么问题,但您是否测试过您的 ConnectionFactory for JMS 配置是否按预期工作?

【讨论】:

    【解决方案2】:

    您的服务激活器类中方法的签名是什么?检查他们有一个(并且只有一个)公共方法,或者将方法属性添加到您的服务激活器定义中。

    通常,您应该更喜欢消息驱动通道适配器而不是 jms:inbout-channel-adapter。最后一个适配器使用轮询器来检查新消息,而消息驱动通道适配器使用 Spring 消息侦听器。

    【讨论】:

      【解决方案3】:

      借助以下配置,我已经达到了类似的要求:

      <context:component-scan base-package="somePackage"/>
      
      <int:channel id="jmsInChannel" />
      
      <bean id="jmsInboundContainer"
            class="org.springframework.jms.listener.DefaultMessageListenerContainer"
            destroy-method="destroy">
          <property name="connectionFactory" ref="..." />
          <property name="destination" ref="jmsQueue" />
          <property name="sessionTransacted" value="true" />
      </bean>
      
      <int-jms:message-driven-channel-adapter channel="jmsInChannel"
          container="jmsInboundContainer" acknowledge="transacted" />
      
      <int:service-activator input-channel="jmsInChannel" ref="myService" />
      

      我的Service实现如下:

      @Component
      public class MyService {
      
          @ServiceActivator
          public void processMessage(
              @Headers Map<String, Object> headers,
              @Payload Message<String> paylaod) {
      
              ...
              ...
          }
      }
      

      【讨论】:

      • 你知道消息没有来时如何调用服务吗?这是我在没有消息时做出反应的要求。
      【解决方案4】:

      我遇到了同样的问题,然后我尝试显式声明入站队列并在入站通道适配器中使用它。

      成功了!

      <int:channel id="source_channel" />
      
      <int-jms:inbound-channel-adapter 
         id="source"
         channel="source_channel"
         destination="inboundQueue"
         connection-factory="...">
         <int:poller fixed-rate="1000" />
      </int-jms:inbound-channel-adapter>
      
      <int:service-activator input-channel="source_channel" ref="sourceMessageReciever"/>
      
      <bean id="inboundQueue" class="org.apache.activemq.command.ActiveMQQueue">
         <constructor-arg value="jms-queue-name"></constructor-arg>
      </bean>
      

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 1970-01-01
        • 2017-12-12
        • 2011-12-12
        • 2020-01-10
        • 2017-01-11
        • 2016-02-10
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多