为什么KafkaMessageListenerContainer永不放弃执行者的线程?

时间:2018-12-26 16:44:24

标签: apache-kafka executorservice spring-kafka threadpoolexecutor scheduledexecutorservice

我有一个程序,其中有多个流可以访问共享资源。为了避免共享资源出现争用情况,我决定使用共享的单线程执行程序对流进行序列化。我更喜欢用这种方法来使程序陷入锁死状态-我的程序不会承受沉重的负担,而且时间也不紧迫。

其中一个流程从Kafka读取消息,这是该流程的代码:

@Bean
public KafkaMessageListenerContainer kafkaFlow(DefaultConsumerFactory consumerFactory, ExecutorService myExecutor) {
    ContainerProperties containerProperties = new ContainerProperties("myTopic");
    ... //more properties
    containerProperties.setConsumerTaskExecutor(new ConcurrentTaskExecutor(myExecutor));
    return new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
}

@Bean
public Executor myExecutor() {
    return Executors.newSingleThreadScheduledExecutor();
}

问题在于,当Kafka流程运行正常时,其他流程似乎从未获得运行的机会。这是为什么?我已经将这种方法与其他JMS容器一起使用,并且效果很好...

谢谢。

1 个答案:

答案 0 :(得分:1)

Kafka要求定期对消费者进行调查。否则将撤销主题/分区分配;容器为每个使用者使用专用线程。

如果您希望共享线程用于其他目的,则需要poll()自己使用使用者,而不是使用侦听器容器,但是仍然需要确保在{{1 }}以避免Kafka认为您的消费者已经死了。