我使用了一个利用WALL_CLOCK_TIME
标点符号的处理器,我注意到在重新平衡阶段后,同一个任务会多次调用init()
方法。
我在init()
:
log.info("In processor init, taskId is {}, cancellable is {}", context.taskId(), statisticsSending);
在日志中,我可以看到它被调用了两次:
07:53:15 INFO - 在处理器中 init,taskId是1_0,可取消是 org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@11a53ebd
07:53:15 INFO - 在处理器中 init,taskId是1_0,可取消是 org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@7770d7b7
另外,我记录了close()
方法中发生的事情,我看到Cancellable
被取消了...
07:53:15 INFO - 关闭可取消 org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@11a53ebd
...从其身份哈希码(11a53ebd)判断,现有处理器已被重用,但也创建了一个新处理器。结果,我的定期任务已安排两次,而不是一次。
我认为每个任务只有一个处理器。什么可能导致这种行为的想法,以及如何防止它发生?
答案 0 :(得分:2)
在重新平衡期间,所有Processor
都会关闭,之后会在重新平衡后再次初始化。这是确保没有数据丢失所必需的。
但是,您看到的哈希是指注册的标点符号,而不是Processor
对象。因此,如果cancel
中的标点符号close
和schedule
中的标点符号init()
中的标点符号将被新的时间表替换。