Spring integration Spring集成JavaDSL服务执行器(.handle)应该使用bean
我有一个spring集成应用程序,它使用Spring integration Spring集成JavaDSL服务执行器(.handle)应该使用bean,spring-integration,Spring Integration,我有一个spring集成应用程序,它使用IntegrationFlowbuilder模式引导Java DSL配置。我需要使用.handle()方法,我不想像大多数web示例那样在那里使用lambda函数。相反,我想将其委托给一个单独的bean(服务)。我如何实现它 我发现下面的一个例子使用了内部类,但我需要使用对其他bean有依赖关系的自动连接Springbean,所以内部类对我来说不是一个选项。对我来说,最好的方法是什么 @Bean public IntegrationFlow icedFlo
IntegrationFlow
builder模式引导Java DSL配置。我需要使用.handle()
方法,我不想像大多数web示例那样在那里使用lambda函数。相反,我想将其委托给一个单独的bean(服务)。我如何实现它
我发现下面的一个例子使用了内部类,但我需要使用对其他bean有依赖关系的自动连接Springbean,所以内部类对我来说不是一个选项。对我来说,最好的方法是什么
@Bean
public IntegrationFlow icedFlow() {
return IntegrationFlows.from(MessageChannels.queue("iced", 10))
.handle(new GenericHandler<OrderItem>() {
@Override
public Object handle(OrderItem payload, Map<String, Object> headers) {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName()
+ " prepared cold drink #" + coldDrinkCounter.incrementAndGet()
+ " for order #" + payload.getOrderNumber() + ": " + payload);
return payload;
}
})
.channel("output")
.get();
}
@Bean
公共集成流icedFlow(){
返回IntegrationFlows.from(MessageChannels.queue(“iced”,10))
.handle(新的GenericHandler(){
@凌驾
公共对象句柄(OrderItem负载、映射头){
不间断。不间断睡眠(1,时间单位。秒);
System.out.println(Thread.currentThread().getName())
+“准备好的冷饮”#“+coldDrinkCounter.incrementAndGet()
+“对于订单#”+payload.getOrderNumber()+”:“+payload);
返回有效载荷;
}
})
.频道(“输出”)
.get();
}
请查找1.1版之后的新API:
@Configuration
@EnableIntegration
@ComponentScan
public class MyConfiguration {
@Autowired
private GreetingService greetingService;
@Bean
public IntegrationFlow greetingFlow() {
return IntegrationFlows.from("greetingChannel")
.handle(this.greetingService)
.get();
}
}
@Component
public class GreetingService {
public void greeting(String payload) {
System.out.println("Hello " + payload);
}
}
该方法还有另一个重载版本:
public B handle(Object service, String methodName) {
有关更多信息,请参阅IntegrationFlowDefinition
JavaDocs
编辑
.handle(this.greetingService::greeting)
样式示例:
@Bean
public IntegrationFlow lambdasFlow() {
return flow -> flow
.handle(this::divideForHalf)
.handle(this::logMessage);
}
public Integer divideForHalf(Integer payload, Map<String, Object> headers) {
return payload / 2;
}
public void logMessage(Message<?> message) {
System.out.println("My Message: " + message);
}
@Bean
公共集成流lambdasFlow(){
回流->流量
.handle(此::除以一半)
.handle(this::logMessage);
}
公共整数除以一半(整数有效负载、映射头){
返回有效载荷/2;
}
公共无效日志消息(消息消息){
System.out.println(“我的消息:+消息”);
}
谢谢Artem,这非常有帮助。不过,我不确定这个方法(对象服务,字符串方法名)
,因为它不允许编译时检查方法名。将来我们是否有可能看到类似.handle(this.greetingService::greeting)
的东西?不管怎样,干得好!嗯,我们现在已经可以这样做了,但是它与特定的功能接口实现有关。this.greetingService::greeting
应该是MessageHandler
或GenericHandler
的方法。this.greetingService::greeting应该是MessageHandler或GenericHandler的方法。我能够找到的函数方法签名。transform(this.greetingService::greeting)
,但不适用于.handle(this.greetingService::greeting)
。我遗漏了什么吗?请对我的答案进行编辑。