3

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

今天花了不少时间,先用过滤器做一个简单的流程

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

消息过滤器是消息选择器的一个非常简单的实现。到目前为止一切顺利,没有花太多时间。但是后来我想记录一条消息,以防 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;
}

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

干杯。

4

1 回答 1

3

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

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

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

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

我同意这种new MessageChannel() {}方法是错误的。确实应该MessageHandler改为进行日志记录。这就是服务责任的层次。也不要忘记有LoggingHandler,通过 Java DSL 可以实现为:

 .filter(messagingFilters, fs -> fs.discardFlow( i -> i.log(message -> (String) message.getPayload().get("msg-failure"))))
于 2017-08-03T19:31:08.003 回答