在我们的系统中,外部客户端将消息放在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在客户端将其放在&#39; jms-queue-name&#39;队列,但这没有发生。这是正确的方法,还是我需要使用messageGateway来做到这一点? 谢谢,
玫瑰
答案 0 :(得分:0)
InboundChannelAdapter和MessageGateway之间的区别仅在于适配器是单向工作而不是双向工作。
我没有真正了解可能出错的情况,但您是否测试过您的JMS ConnectionFactory配置是否按预期工作?
答案 1 :(得分:0)
您的服务激活器类中该方法的签名是什么?检查它们是否有一个(且只有一个)公共方法,或者将method属性添加到服务激活器定义中。
通常,您应该更喜欢使用消息驱动通道适配器而不是jms:inbout-channel-adapter。最后一个适配器使用轮询器检查新消息,而消息驱动通道适配器使用Spring消息监听器。
答案 2 :(得分: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) {
...
...
}
}
答案 3 :(得分: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>