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

Spring integration 在Spring Integration DSL中使用带丢弃通道的过滤器,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,我不知道这个问题是关于spring集成、spring集成dsl还是两者,所以我只添加了两个标签 我今天花了相当多的时间,首先用过滤器做一个简单的流程 StandardIntegrationFlow flow = IntegrationFlows.from(...) .filter(messagingFilter) .transform(transformer) .handle(

我不知道这个问题是关于spring集成、spring集成dsl还是两者,所以我只添加了两个标签

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

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;
}
StandardIntegrationFlow=IntegrationFlows.from(…)
.filter(messagingFilters,fs->fs.discardFlow(i->i.channel(discardChannel()))
.变换(变压器)
.handle((m)->{
(...)
})
.get();
(...)
公共消息频道丢弃频道(){
MessageChannel=newmessagechannel(){
@凌驾
公共布尔发送(消息){
log.warn((字符串)message.getPayload().get(“msg failure”);
返回true;
}
@凌驾
公共布尔发送(消息,长超时){
返回此。发送(消息);
}
};
返回通道;
}
这既丑陋又冗长,所以问题是,我在这里做错了什么,我应该如何用更好、更干净、更优雅的解决方案来做


干杯。

您的问题是,您看不到
过滤器是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"))))