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" 

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/core.html#channel-implementations-directchannel