首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring集成DSL中使用带丢弃信道的滤波器

在Spring集成DSL中使用带丢弃信道的滤波器
EN

Stack Overflow用户
提问于 2017-08-03 19:08:58
回答 1查看 2.7K关注 0票数 3

我不知道这个问题是关于spring-integration,spring-integration-dsl还是两者兼而有之,所以我只添加了两个标签.

今天我花了相当多的时间,首先用过滤器做一个简单的流。

代码语言:javascript
复制
StandardIntegrationFlow flow = IntegrationFlows.from(...)
                    .filter(messagingFilter)
                    .transform(transformer)
                    .handle((m) -> {
                        (...)
                    })
                    .get();

messagingFilter是MessageSelector的一个非常简单的实现。到目前为止还不错,没花太多时间。但是,我想记录一条消息,以防MessageSelector返回false,这里是我被卡住的地方。

过了很长一段时间后,我得到了这样的结果:

代码语言:javascript
复制
StandardIntegrationFlow flow = IntegrationFlows.from(...)
                    .filter(messagingFilters, fs -> fs.discardFlow( i -> i.channel(discardChannel()))
                    .transform(transformer)
                    .handle((m) -> {
                        (...)
                    })
                    .get();

(...)

public MessageChannel discardChannel() {
    MessageChannel channel = new MessageChannel(){
        @Override
        public boolean send(Message<?> message) {
            log.warn((String) message.getPayload().get("msg-failure"));
            return true;
        }
        @Override
        public boolean send(Message<?> message, long timeout) {
            return this.send(message);
        }
    };
    return channel;
}

这既丑陋又冗长,所以问题是,我在这里做错了什么,我应该如何在一个更好、更干净、更优雅的解决方案中做到这一点?

干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 19:31:08

您没有看到Filter是EI模式实现的问题,它所能做的最大的就是将丢弃的消息发送到某个通道。它不会记录任何东西,因为这种方法不会是基于消息传递的。

用例所需的最简单方法是:

代码语言:javascript
复制
.discardFlow(df -> df
        .handle(message -> log.warn((String) message.getPayload().get("msg-failure")))))

你的逻辑就是记录。其他人可能会做更复杂的逻辑。因此,最终您将习惯于端点之间的通道抽象。

我同意new MessageChannel() {}方法是错误的。日志记录确实应该在MessageHandler中完成。这就是服务责任的级别。另外,不要忘记有LoggingHandler,它可以通过Java实现如下:

代码语言:javascript
复制
 .filter(messagingFilters, fs -> fs.discardFlow( i -> i.log(message -> (String) message.getPayload().get("msg-failure"))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45492656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档