如何保证多个集成流程的有序 start/stop
how to guaranty orderly start/stop of multiple integration-flows
假设我的应用程序有以下 2 个流程:
@Bean
IntegrationFlow flow1() {
return IntegrationFlows.from(() -> LocalDateTime.now(), c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10))))
.channel("DIRECT_CHANNEL")
.get();
}
@Bean
IntegrationFlow flow2() {
return IntegrationFlows.from("DIRECT_CHANNEL")
.handle(lateToStartOutboundAdapter)
.get();
}
如何保证 flow1 不会在 flow2 中的所有组件都准备好之前开始发送消息?
更一般地说,我怎样才能有序地开始我的集成流程?
我目前的做法如下:
1) 我定义了一个 controlBus Integration-flow:
@Bean
public IntegrationFlow controlBusFlow() {
return IntegrationFlows.from("CONTROL_CHANNEL").controlBus().get();
}
2) 我将所有其他集成流程中的第一个端点组件设置为 autoStart=false:
@Bean
IntegrationFlow flow1() {
return IntegrationFlows.from(() -> LocalDateTime.now(),
c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10)))
.autoStartup(false)
.id("flow1Component"))
.transform(p -> p)
.channel("DIRECT_CHANNEL")
.get();
}
@Bean
IntegrationFlow flow2() {
return IntegrationFlows.from("DIRECT_CHANNEL")
.transform(p -> p,
c -> c.autoStartup(false)
.id("flow2Component"))
.log(LoggingHandler.Level.INFO, m -> m.toString())
.get();
}
3) 最后我定义了一个服务器组件,我在其中通过控制总线启动所有流程:
@Component
public class Server implements SmartLifecycle {
private boolean running;
List<String> flowComponents = ImmutableList.of("flow2Component","flow1Component")
@Autowired
@Qualifier("CONTROL_CHANNEL")
private MessageChannel controlChannel;
public void start() {
flowComponents.forEach(s ->
controlChannel.send(MessageBuilder.withPayload("@" + s + ".start()").build());
running = true;
}
public void stop() {
flowComponents.reverse().forEach(s ->
controlChannel.send(MessageBuilder.withPayload("@" + s + ".stop()").build());
running = false;
}
public boolean isRunning() {
return running;
}
以上是有序 start/stop 我的集成流程的有效方法吗?
非常感谢您的专业知识。
最好的问候
DirectChannel
的消费者无需将 autoStartup
设置为 false
;这样的组件不是"active"。 start()
所做的就是让消费者订阅该频道。
你只需要在轮询器上设置它,当你准备好时启动那个。
假设我的应用程序有以下 2 个流程:
@Bean
IntegrationFlow flow1() {
return IntegrationFlows.from(() -> LocalDateTime.now(), c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10))))
.channel("DIRECT_CHANNEL")
.get();
}
@Bean
IntegrationFlow flow2() {
return IntegrationFlows.from("DIRECT_CHANNEL")
.handle(lateToStartOutboundAdapter)
.get();
}
如何保证 flow1 不会在 flow2 中的所有组件都准备好之前开始发送消息?
更一般地说,我怎样才能有序地开始我的集成流程?
我目前的做法如下:
1) 我定义了一个 controlBus Integration-flow:
@Bean
public IntegrationFlow controlBusFlow() {
return IntegrationFlows.from("CONTROL_CHANNEL").controlBus().get();
}
2) 我将所有其他集成流程中的第一个端点组件设置为 autoStart=false:
@Bean
IntegrationFlow flow1() {
return IntegrationFlows.from(() -> LocalDateTime.now(),
c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10)))
.autoStartup(false)
.id("flow1Component"))
.transform(p -> p)
.channel("DIRECT_CHANNEL")
.get();
}
@Bean
IntegrationFlow flow2() {
return IntegrationFlows.from("DIRECT_CHANNEL")
.transform(p -> p,
c -> c.autoStartup(false)
.id("flow2Component"))
.log(LoggingHandler.Level.INFO, m -> m.toString())
.get();
}
3) 最后我定义了一个服务器组件,我在其中通过控制总线启动所有流程:
@Component
public class Server implements SmartLifecycle {
private boolean running;
List<String> flowComponents = ImmutableList.of("flow2Component","flow1Component")
@Autowired
@Qualifier("CONTROL_CHANNEL")
private MessageChannel controlChannel;
public void start() {
flowComponents.forEach(s ->
controlChannel.send(MessageBuilder.withPayload("@" + s + ".start()").build());
running = true;
}
public void stop() {
flowComponents.reverse().forEach(s ->
controlChannel.send(MessageBuilder.withPayload("@" + s + ".stop()").build());
running = false;
}
public boolean isRunning() {
return running;
}
以上是有序 start/stop 我的集成流程的有效方法吗?
非常感谢您的专业知识。
最好的问候
DirectChannel
的消费者无需将 autoStartup
设置为 false
;这样的组件不是"active"。 start()
所做的就是让消费者订阅该频道。
你只需要在轮询器上设置它,当你准备好时启动那个。