服务激活器和.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();
}

另请参见 Lambda和Message<?>参数