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

Ser*_*nov 3 spring-integration

我有一个 Spring 集成应用程序,其中使用IntegrationFlow构建器模式引导 Java DSL 配置。我需要使用一个.handle()方法,并且我不想像大多数网络示例那样在那里有 lambda 函数。相反,我想将其委托给一个单独的 bean(服务)。我该如何实施?

我发现下面的一个示例使用了内部类,但我需要使用依赖于其他 bean 的自动装配 Spring bean,因此内部类对我来说不是一个选择。对我来说最好的方法是什么?

@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();
}
Run Code Online (Sandbox Code Playgroud)

Art*_*lan 5

请寻找自 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

https://spring.io/blog/2015/04/15/spring-integration-java-dsl-1-1-m1-is-available

该方法还有另一个重载版本:

public B handle(Object service, String methodName) {
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)