关闭春季与毒丸合并的生产者/消费者

时间:2018-03-21 12:08:23

标签: java spring spring-integration message-queue producer-consumer

如何使用毒丸来阻止消息处理程序(和消息供应商)进行弹簧集成?

我有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的春天我会怎么做,但我在这里有点无能为力。

1 个答案:

答案 0 :(得分:0)

我不知道poison pill是什么,我不清楚你在这里谈论的是什么,但如果故事是关于stop,那么你绝对应该考虑现有的org.springframework.context.Lifecycle在Spring中控制。在这种情况下,所有Spring Integration端点都属于该类型,您只需使用它们的stop()即可。

出于管理目的,Spring Integration提供了Control Bus组件。为此,您可以发送带有stop()表达式的命令消息,以真正停止特定端点。

注意:在消费者面前停止生产者是一种好习惯。这样您就不会丢失没有消费者需要处理的消息。