1

在我们的系统中,外部客户端将消息放在 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"/>

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

玫瑰

4

4 回答 4

0

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

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

于 2013-08-02T09:55:51.793 回答
0

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

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

于 2013-08-02T10:13:51.733 回答
0

在以下配置的帮助下,我已经实现了类似的要求:

<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" />

我的服务实现如下:

@Component
public class MyService {

    @ServiceActivator
    public void processMessage(
        @Headers Map<String, Object> headers,
        @Payload Message<String> paylaod) {

        ...
        ...
    }
}
于 2013-08-05T05:20:19.317 回答
0

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

有效!

<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>
于 2015-11-09T08:48:34.107 回答