我在Spring Integration流程中通过Java DSL配置了聚合器,并且我希望在发生组超时时抛出一个转到全局错误通道的异常。
丢弃渠道对我不利,因为丢弃邮件是集团成员级别,而不是整个集团。
我已尝试使用应用事件发布者,但发布者对象似乎没有被调用:
.aggregate(new Consumer<AggregatorSpec>() {
@Override
public void accept(AggregatorSpec aggregatorSpec) {
try {
aggregatorSpec
.outputProcessor(groupPublishStrategy())
.correlationStrategy(groupPublishStrategy())
.releaseStrategy(groupPublishStrategy())
.groupTimeout(groupTimeout)
.get().getT2().setApplicationEventPublisher(myGroupExpirationPublisher());
}
catch (Exception e) {
e.printStackTrace();
}
}
})
是否有建议的方法来获取此用例的通知?任何想法为什么上述似乎都不起作用?
我想我可以扩展AggregatorSpec
类来按照我想要的方式配置消息处理程序,但我想知道是否可以使用库存SI类来完成此操作。
答案 0 :(得分:2)
刚刚测试过并在bean初始化阶段正确填充了ApplicationEventPublisher
。
expireGroup(Object correlationKey, MessageGroup group)
足以在此处展示它,但您可以在GitHub上找到它的代码。因此,当我们达到此方法时,始终会发布MessageGroupExpiredEvent
。
当然,如果discardMessage(message);
没有抛出异常。
OTOH exprireGroup()
仅在这种情况下可以访问:
if (this.releaseStrategy.canRelease(groupNow)) {
completeGroup(correlationKey, groupNow);
}
else {
expireGroup(correlationKey, groupNow);
}
因此,请确保您的groupPublishStrategy()
具有正确的逻辑,并且当您的论坛尚未完成时不会返回true
。
嗯,如果你为你的用例调试AbstractCorrelatingMessageHandler
真的会更好。如果您确定在某些groupTimeout
期间未完成您的论坛,则forceComplete(MessageGroup group)
是您开始调试的好地方。
否则,当您认为必须发出事件时,请分享DEBUG
类别的org.springframework.integration
日志。