Spring与JMS支持的渠道集成 - “Dispatcher没有订阅者”

时间:2013-08-13 21:18:39

标签: spring-integration spring-jms

我是Spring Integration的新手,我正在尝试使用SI和ActiveMQ执行一个非常基本的Producer / Consumer应用程序。

我看到消息正在生成并存储在队列中,但是当Consumer(在这种情况下是服务激活器)处理消息并尝试将新消息返回到输出通道时,我不断收到警告消息:

11:28:14.425 WARN [DefaultMessageListenerContainer-1][org.springframework.jms.listener.DefaultMessageLis tenerContainer] Execution of JMS message listener failed, and no ErrorHandler has been set.
org.springframework.integration.MessageDeliveryExc eption: Dispatcher has no subscribers for jms-channel jsonResponseChannel.
at org.springframework.integration.jms.SubscribableJm sChannel$DispatchingMessageListener.onMessage(Subs cribableJmsChannel.java:159)

Below is the snapshot of my context xmls :

common-context.xml
---------------------
..............
<bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="INPUT_MSG_QUEUE" />
</bean>
<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="OUTPUT_MSG_QUEUE" />
</bean>
<int-jms:channel id="jsonGreetingRequests" queue-name="INPUT_MSG_QUEUE" message-driven="true"/>
<int-jms:channel id="jsonResponseChannel" queue-name="OUTPUT_MSG_QUEUE" message-driven="true"/>
<bean name="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFacto ry">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
..............

consumer-context.xml
---------------------
.............

<int-jms:message-driven-channel-adapter id="newRequestsInChannelAdapter" destination="requestQueue" channel="jsonGreetingRequests"/>
<!-- <int-jms:inbound-gateway request-channel="jsonGreetingRequests" reply-channel="jsonResponseChannel" request-destination="requestQueue" />-->

<int:chain input-channel="jsonGreetingRequests" output-channel="jsonResponseChannel">
<int:json-to-object-transformer type="com.periscope.samples.service.Message"/>
<int:service-activator method="greetHello">
<bean class="com.periscope.samples.service.impl.HelloWor ldServiceImpl"/>
</int:service-activator>
<int:object-to-json-transformer />
</int:chain>

<stream:stdout-channel-adapter id="greetingsStdOut" channel="jsonResponseChannel"/>
.....................

producer-context.xml
-----------------------
.....
<int:gateway id="greetings"
default-request-channel="greetingRequests"
service-interface="com.periscope.samples.service.Greetings "/>
<int:channel id="greetingRequests"/>

<int:chain input-channel="greetingRequests" output-channel="jsonGreetingRequests">
<int:object-to-json-transformer />
</int:chain>

<int-jms:outbound-channel-adapter id="jmsGreetingsOutChannelAdapter" channel="jsonGreetingRequests" destination="requestQueue"/>
.......

这基本上是一个包含在用户定义对象中的msg字符串,然后在INPUT_MSG_QUEUE上发送。消费者读取msg,处理它并在OUTPUT_MSG_QUEUE上返回一条新消息。这些是ActiveMQ支持的频道和队列。

有人可以请问如何摆脱这些警告,因为在这个特定的用例中,我不期望任何其他订阅者在output_msg_queue上监听吗?

Thanks. 

1 个答案:

答案 0 :(得分:0)

您不需要jms通道适配器和jms支持的队列。

使用当前配置,您在INPUT_MSG_QUEUE(频道和频道适配器)上有两个消费者。

jms支持的频道实际上只需要消息持久性。要将消息发送到其他应用程序,请使用适配器。

只需更改这些

即可
<int-jms:channel id="jsonGreetingRequests" queue-name="INPUT_MSG_QUEUE" message-   driven="true"/>
<int-jms:channel id="jsonResponseChannel" queue-name="OUTPUT_MSG_QUEUE" message-driven="true"/>

简单<int:channel/> s。

另外,假设您正在使用请求/响应语义,从<gateway/>开始,您需要使用jms in / out网关,而不是适配器(用于单向集成)。