如何使用毒丸来阻止消息处理程序(和消息供应商)进行弹簧集成?
我有N个生产者(子类供应商)和M个消费者(子类GenericHandler)的设置。它们通过无界队列连接。
生产者应该发送每个K消息,然后发送毒丸(我想每个生产者应该发送M / N毒药,即)。
我希望完全停止生产者(他们由TaskExecutor控制)
@Bean(name = "supplierExecutor")
Executor supplierExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(x);
executor.setMaxPoolSize(y);
executor.setKeepAliveSeconds(0);
executor.setQueueCapacity(z);
executor.setThreadNamePrefix("supplier-");
executor.initialize();
return executor;
}
另外,我想完全阻止消费者,但要优雅。 (它们由自己的TaskScheduler控制)
@Bean(name = "consumerScheduler")
TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(a);
taskScheduler.setThreadNamePrefix("temp-consumer");
taskScheduler.initialize();
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return taskScheduler;
}
目前,在我的供应商get()
方法中,我有以下代码段
public Foo get() {
if (reachedMaxSendLimit()) {
incrementMsgSentCount();
return POISON_PILL;
} else if (surpassedMaxSentLimit()) {
return null;
} else {
return handlePayload(payload);
}
}
是否有明确的方法来实现我想要完成的行为? 我知道如果没有普通Runnables的春天我会怎么做,但我在这里有点无能为力。
答案 0 :(得分:0)
我不知道poison pill
是什么,我不清楚你在这里谈论的是什么,但如果故事是关于stop
,那么你绝对应该考虑现有的org.springframework.context.Lifecycle
在Spring中控制。在这种情况下,所有Spring Integration端点都属于该类型,您只需使用它们的stop()
即可。
出于管理目的,Spring Integration提供了Control Bus组件。为此,您可以发送带有stop()
表达式的命令消息,以真正停止特定端点。
注意:在消费者面前停止生产者是一种好习惯。这样您就不会丢失没有消费者需要处理的消息。