Spring 集成 Java DSL 服务执行器 (.handle) 应该使用 bean
Spring integration Java DSL service actuator (.handle) should use bean
我有一个 spring 集成应用程序,其中 Java DSL 配置使用 IntegrationFlow
构建器模式引导。我需要使用 .handle()
方法,并且我不想像大多数网络示例那样在那里使用 lambda 函数。相反,我想将其委托给一个单独的 bean(服务)。我该如何实施?
我发现下面的一个例子使用了 inner class,但我需要使用自动装配的 Spring bean,它依赖于其他 bean,所以 inner class 不是一个选项我。对我来说最好的方法是什么?
@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();
}
请找到一个新的 API 自版本 1.1 以来:
@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);
}
}
https://spring.io/blog/2015/04/15/spring-integration-java-dsl-1-1-m1-is-available
该方法还有另一个重载版本:
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);
}
我有一个 spring 集成应用程序,其中 Java DSL 配置使用 IntegrationFlow
构建器模式引导。我需要使用 .handle()
方法,并且我不想像大多数网络示例那样在那里使用 lambda 函数。相反,我想将其委托给一个单独的 bean(服务)。我该如何实施?
我发现下面的一个例子使用了 inner class,但我需要使用自动装配的 Spring bean,它依赖于其他 bean,所以 inner class 不是一个选项我。对我来说最好的方法是什么?
@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();
}
请找到一个新的 API 自版本 1.1 以来:
@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);
}
}
https://spring.io/blog/2015/04/15/spring-integration-java-dsl-1-1-m1-is-available
该方法还有另一个重载版本:
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);
}