【问题标题】:Spring integration DSL: configure handler that handles only when the argument matchesSpring 集成 DSL:配置仅在参数匹配时处理的处理程序
【发布时间】:2018-03-03 04:27:09
【问题描述】:

我正在使用 Spring Integration DSL 配置。是否可以添加方法引用处理程序,以便仅当消息有效负载与处理程序参数类型匹配时才调用处理程序?

例如:在下面的代码中,如果payload是MyObject2,Spring会在handleMessage抛出ClassCastException。相反,我想做的是绕过handleMessage 并被handleMessage2 接走。

@Bean
public IntegrationFlow myFlow() {
  return IntegrationFlows
                .from("myChannel")
                .handle(this::handleMessage)
                .handle(this::handleMessage2)
                ...
}

public MyObject2 handleMessage(MyObject o, Map headers){
...
}

public MyObject2 handleMessage(MyObject2 o, Map headers){
...
}

【问题讨论】:

    标签: spring-integration spring-integration-dsl


    【解决方案1】:

    .handle() 背后有一个技巧,它在初始化阶段选择所有适当的消息处理方法,然后在运行时执行该功能:

    HandlerMethod candidate = this.findHandlerMethodForParameters(parameters);
    

    所以,为了能够根据请求消息中的payload 选择这个或那个方法,你应该说.handle() 来做到这一点:

      return IntegrationFlows
                .from("myChannel")
                .handle(this)
                ...
    

    当然,在这种情况下,最好将这些方法移至单独的服务类,以避免从该@Configuration 类中选择额外的方法。

    【讨论】:

    • 这看起来很神奇,但我觉得这样的自动选择方法容易出错。例如:在我的示例中,如果传入 MyObject 类型的消息,我希望 handleMessage 和 handleMessage2 按此顺序运行。我相信你的技术只会运行 handleMessage,而不是 handleMessage2。
    • 嗯,“两种方法”绝对是不同的故事。这超出了 Spring Integration 的范围。虽然我们可以为您提供解决方案:publish-subscriberecipient-list-router。但同样:这值得它自己的问题。
    • 为什么你认为它超出了 Spring 集成范围?我的实际用例是处理 FileSplitter SOF、EOF 标记。常规消息处理程序不应该关心它们,但聚合器和其他文件处理程序会。因此,我希望这些 SOF、EOF 标记仅通过流程,而无需让我的所有处理程序方法沿流程检查类型。
    • 请形成一个新的 SO 问题,提供更多信息进行调查。看不出它与当前的关系如何。
    • 我完全认为它们是相关的,但很好,我会发布另一个更具体的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多