service-activator 仅对半消息激活
service-activator activated only for half messages
我正在使用(已设置)Spring 集成工作流,我尝试在其中添加一个 service-activator
,它基本上会计算消息数量。
在此示例中,我记录了消息的有效负载,但仅用于调试目的。
<bean id="messageCounterActivator" class="com.my.company.activators.MessageCounterActivator"/>
<bean id="jmsQueue2" class="com.ibm.mq.jms.MQQueue" depends-on="jmsConnectionFactory">...</bean>
<int:channel id="channelMQ_MQ" ></int:channel>
<int:service-activator input-channel="channelMQ_MQ" method="countMessage" ref="messageCounterActivator"/>
<int-jms:message-driven-channel-adapter id="jmsIn" channel="channelMQ_MQ" destination="jmsQueue"/>
<int-jms:outbound-channel-adapter channel="channelMQ_MQ"
id="jmsOut2"
destination="jmsQueue2"
connection-factory="connectionFactoryCaching2"
delivery-persistent="true"
explicit-qos-enabled="true"
session-transacted="true" />
并且来自激活器 bean:
public Message<?> countMessage(Message<?> message) {
LOG.debug("=> " + message.getPayload());
someCounter.increment();
return message;
}
一旦此 bidge 启动,它就会运行良好:所有消息都从 A 路由到 B (MqSeries => MqSeries),并且计数器更新....每 2 条消息!
MessageCounterActivator - => message 1
MessageCounterActivator - => message 3
MessageCounterActivator - => message 5
MessageCounterActivator - => message 7
MessageCounterActivator - => message 9
MessageCounterActivator - => message 11
MessageCounterActivator - => message 13
MessageCounterActivator - => message 15
MessageCounterActivator - => message 17
MessageCounterActivator - => message 19
这对我来说很奇怪,但我怀疑一些嵌入式 activator/listener 与我的 service-activator
竞争(我从这里的一些帖子中读到,当 2 个激活器(包括记录器激活器)处于活动状态时一次:你可能有这样的行为)。也许是因为我有 2 个通道适配器?没看到这里谁是竞争对手
知道如何让我的激活器以正确的方式工作吗?
我会说你的计数逻辑不是主流的一部分。因此,最好研究窃听模式并考虑改用 <int:outbound-channel-adapter>
。只是因为您不会 return 从该计数方法中得到任何东西。
为同一消息调用不同端点的另一种方法是 <int:publish-subscribe-channel>
。
现在您用 <int:channel id="channelMQ_MQ">
声明一个 DirectChannel
,默认情况下它的订阅者有循环分发策略。这正是您看到订阅者出现奇偶行为的原因。
不确定你为什么错过了,但你确实有两个订阅者订阅了这个直接频道:
<int:service-activator input-channel="channelMQ_MQ"
<int-jms:outbound-channel-adapter channel="channelMQ_MQ"
我正在使用(已设置)Spring 集成工作流,我尝试在其中添加一个 service-activator
,它基本上会计算消息数量。
在此示例中,我记录了消息的有效负载,但仅用于调试目的。
<bean id="messageCounterActivator" class="com.my.company.activators.MessageCounterActivator"/>
<bean id="jmsQueue2" class="com.ibm.mq.jms.MQQueue" depends-on="jmsConnectionFactory">...</bean>
<int:channel id="channelMQ_MQ" ></int:channel>
<int:service-activator input-channel="channelMQ_MQ" method="countMessage" ref="messageCounterActivator"/>
<int-jms:message-driven-channel-adapter id="jmsIn" channel="channelMQ_MQ" destination="jmsQueue"/>
<int-jms:outbound-channel-adapter channel="channelMQ_MQ"
id="jmsOut2"
destination="jmsQueue2"
connection-factory="connectionFactoryCaching2"
delivery-persistent="true"
explicit-qos-enabled="true"
session-transacted="true" />
并且来自激活器 bean:
public Message<?> countMessage(Message<?> message) {
LOG.debug("=> " + message.getPayload());
someCounter.increment();
return message;
}
一旦此 bidge 启动,它就会运行良好:所有消息都从 A 路由到 B (MqSeries => MqSeries),并且计数器更新....每 2 条消息!
MessageCounterActivator - => message 1
MessageCounterActivator - => message 3
MessageCounterActivator - => message 5
MessageCounterActivator - => message 7
MessageCounterActivator - => message 9
MessageCounterActivator - => message 11
MessageCounterActivator - => message 13
MessageCounterActivator - => message 15
MessageCounterActivator - => message 17
MessageCounterActivator - => message 19
这对我来说很奇怪,但我怀疑一些嵌入式 activator/listener 与我的 service-activator
竞争(我从这里的一些帖子中读到,当 2 个激活器(包括记录器激活器)处于活动状态时一次:你可能有这样的行为)。也许是因为我有 2 个通道适配器?没看到这里谁是竞争对手
知道如何让我的激活器以正确的方式工作吗?
我会说你的计数逻辑不是主流的一部分。因此,最好研究窃听模式并考虑改用 <int:outbound-channel-adapter>
。只是因为您不会 return 从该计数方法中得到任何东西。
为同一消息调用不同端点的另一种方法是 <int:publish-subscribe-channel>
。
现在您用 <int:channel id="channelMQ_MQ">
声明一个 DirectChannel
,默认情况下它的订阅者有循环分发策略。这正是您看到订阅者出现奇偶行为的原因。
不确定你为什么错过了,但你确实有两个订阅者订阅了这个直接频道:
<int:service-activator input-channel="channelMQ_MQ"
<int-jms:outbound-channel-adapter channel="channelMQ_MQ"