我是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.
答案 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网关,而不是适配器(用于单向集成)。