使用Spring Integration DSL获取聚合器消息组到期的事件?

时间:2016-08-10 18:29:38

标签: spring-integration

我在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类来完成此操作。

1 个答案:

答案 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日志。