服务激活器和.handle()
方法
.handle()
EIP 方法的目的是调用任何MessageHandler
实现或某个POJO上的任何方法。另一个选项是使用lambda表达式定义“活动”。因此,我们引入了一个泛型GenericHandler<P>
函数接口。它的handle
方法需要两个参数:P payload
和MessageHeaders 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<?>
参数。