Spring integration Spring集成JavaDSL服务执行器(.handle)应该使用bean

Spring integration Spring集成JavaDSL服务执行器(.handle)应该使用bean,spring-integration,Spring Integration,我有一个spring集成应用程序,它使用IntegrationFlowbuilder模式引导Java DSL配置。我需要使用.handle()方法,我不想像大多数web示例那样在那里使用lambda函数。相反,我想将其委托给一个单独的bean(服务)。我如何实现它 我发现下面的一个例子使用了内部类,但我需要使用对其他bean有依赖关系的自动连接Springbean,所以内部类对我来说不是一个选项。对我来说,最好的方法是什么 @Bean public IntegrationFlow icedFlo

我有一个spring集成应用程序,它使用
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)
。我遗漏了什么吗?请对我的答案进行编辑。