在 Spring Integration DSL 中使用带有丢弃通道的过滤器

Posted

技术标签:

【中文标题】在 Spring Integration DSL 中使用带有丢弃通道的过滤器【英文标题】:Using filter with a discard channel in Spring Integration DSL 【发布时间】:2018-01-11 13:22:33 【问题描述】:

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

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

StandardIntegrationFlow flow = IntegrationFlows.from(...)
                    .filter(messagingFilter)
                    .transform(transformer)
                    .handle((m) -> 
                        (...)
                    )
                    .get();

messagingFilter 是 MessageSelector 的一个非常简单的实现。到目前为止一切顺利,没有花太多时间。但是后来我想记录一条消息,以防 MessageSelector 返回错误,这就是我卡住的地方。

经过一段时间后,我最终得到了这个:

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;

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

干杯。

【问题讨论】:

【参考方案1】:

您没有看到Filter 是EI 模式实现的问题,它最多可以将丢弃的消息发送到某个通道。它不会记录任何内容,因为这种方法已经不是基于消息的。

您的用例所需的最简单方法如下:

.discardFlow(df -> df
        .handle(message -> log.warn((String) message.getPayload().get("msg-failure")))))

你的逻辑只是记录。其他一些人可能会做更复杂的逻辑。所以,最终你会习惯使用端点之间的 channel 抽象。

我同意new MessageChannel() 方法是错误的。日志记录确实应该在 MessageHandler 中完成。这就是服务责任的层次。另外别忘了还有LoggingHandler,通过Java DSL可以实现为:

 .filter(messagingFilters, fs -> fs.discardFlow( i -> i.log(message -> (String) message.getPayload().get("msg-failure"))))

【讨论】:

以上是关于在 Spring Integration DSL 中使用带有丢弃通道的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Integration DSL 变压器

使用 Spring Integration DSL 读取 Tibco EMS 主题

Spring Integration DSL:PublishSubscribeChannel 订单

Spring Integration DSL JMS 入站/出站网关

如何在 Spring Integration DSL 中为通道设置多个消息处理程序?

Spring Integration DSL 中的路由