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

时间:2017-08-03 19:08:59

标签: spring-integration spring-integration-dsl

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

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

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

messagingFilter是MessageSelector的一个非常简单的实现。到目前为止这么好,花了很多时间。但后来我想记录一条消息,以防MessageSelector返回false,这就是我遇到的问题。

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

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 个答案:

答案 0 :(得分:2)

您的问题是,您没有看到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"))))