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

我今天花费了大量时间,首先使用过滤器进行简单处理

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


essagingFilter是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;
}


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

干杯。

最佳答案

您看不到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"))))

关于spring-integration - 在Spring Integration DSL中将过滤器与丢弃 channel 一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45492656/

10-11 03:53