spring集成messagegroupstorereaper全局错误通道

cotxawn7  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(366)

我使用的是spring集成聚合器和messagegroupstorereaper,但不知怎么的,错误并没有到达全局errorchannel。

<int:aggregator id="agg"
                    ref="MyMsgsAggregator"
                    input-channel="myAggInputChannel"
                    output-channel="processInputChannel"
                    discard-channel="errorChannel"
                    method="aggMessages"
                    message-store="messageGroupStore"
                    send-partial-result-on-expiry="true"
                    expire-groups-upon-completion="true" />

<bean id="messageGroupStore" class="org.springframework.integration.store.SimpleMessageStore" />

<task:scheduled-tasks>
        <task:scheduled ref="multipartAggregatorReaper" method="run" fixed-rate="5000" />
</task:scheduled-tasks>

如果在“processinputchannel”之后出现任何异常(例如到期时的部分结果),则异常不会到达全局“errorchannel”。
甚至我尝试用poller将任务调度作业替换为入站通道适配器(正如@gary所建议的),但仍然没有成功:

<int:inbound-channel-adapter channel="reaperChannel" ref="MyMsgsAggregator" method="triggerReaper"> 
<int:poller error-channel="**errorChannel**" fixed-rate="5000">         
</int:poller>

</int:inbound-channel-adapter>
请建议
谢谢

z8dt9xmd

z8dt9xmd1#

你的问题是: send-partial-result-on-expiry="true" . 这一选择确实是相互排斥的 discard-channel :

protected void expireGroup(Object correlationKey, MessageGroup group, Lock lock) {
    ...
    if (this.sendPartialResultOnExpiry) {
        ...
        completeGroup(correlationKey, group, lock);
    }
    else {
        ...
        group.getMessages()
                .forEach(this::discardMessage);
    }
    ...
}

所以,这并不奇怪,你的消息后,收获到的网站 processInputChannel ,不是 errorChannel .
此外,还有 discardChannel 不是关于错误。当我们收获和收获时丢弃时,不会抛出异常 ErrorMessage 不是从那里送来的。收割组的每一条消息都作为常规消息发送到该组 discardChannel .

相关问题