服务激活器和 .handle() 方法

.handle() EIP 方法的目标是调用任何 MessageHandler 实现或某个 POJO 上的任何方法。另一种选择是使用 lambda 表达式定义“活动”。因此,我们引入了泛型 GenericHandler<P> 函数式接口。它的 handle 方法需要两个参数:P payloadMessageHeaders headers(从版本 5.1 开始)。有了这些,我们可以定义如下流程

@Bean
public IntegrationFlow myFlow() {
    return IntegrationFlow.from("flow3Input")
        .<Integer>handle((p, h) -> p * 2)
        .get();
}

上面的例子将它接收到的任何整数都翻倍。

然而,Spring Integration 的主要目标之一是通过运行时类型转换从消息负载转换为消息处理程序的目标参数来实现松耦合。由于 Java 不支持 lambda 类的泛型类型解析,我们引入了一种解决方法,为大多数 EIP 方法和 LambdaMessageProcessor 添加了额外的 payloadType 参数。这样做将繁重的转换工作委托给 Spring 的 ConversionService,它使用提供的 type 和请求的消息来定位方法参数。以下示例展示了最终的 IntegrationFlow 可能是什么样子

@Bean
public IntegrationFlow integerFlow() {
    return IntegrationFlow.from("input")
            .<byte[], String>transform(p - > new String(p, "UTF-8"))
            .handle(Integer.class, (p, h) -> p * 2)
            .get();
}

我们也可以在 ConversionService 中注册一些 BytesToIntegerConverter 来摆脱额外的 .transform()

@Bean
@IntegrationConverter
public BytesToIntegerConverter bytesToIntegerConverter() {
   return new BytesToIntegerConverter();
}

@Bean
public IntegrationFlow integerFlow() {
    return IntegrationFlow.from("input")
             .handle(Integer.class, (p, h) -> p * 2)
            .get();
}