我有一个程序,其中有多个流可以访问共享资源。为了避免共享资源出现争用情况,我决定使用共享的单线程执行程序对流进行序列化。我更喜欢用这种方法来使程序陷入锁死状态-我的程序不会承受沉重的负担,而且时间也不紧迫。
其中一个流程从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容器一起使用,并且效果很好...
谢谢。
答案 0 :(得分:1)
Kafka要求定期对消费者进行调查。否则将撤销主题/分区分配;容器为每个使用者使用专用线程。
如果您希望共享线程用于其他目的,则需要poll()
自己使用使用者,而不是使用侦听器容器,但是仍然需要确保在{{1 }}以避免Kafka认为您的消费者已经死了。