我正在使用InterProcessSemaphoreMutex作为分布式锁定配方。
锁的典型路径可能是
/锁定/日历/ UUID
其中uuid当然是一个uuid,因此可能会生成许多锁定路径。
我认为最终需要清理这些路径,所以在解锁后我尝试使用childrea和reaper。
ChildReaper类的作品。如果我添加/ lock / calendar / uuid,它会愉快地删除子项。日志显示它删除了租约和锁定,并且节点本身在zkClient中显示已经消失但是突然它开始在看似无限循环中抱怨路径消失了。尽管尝试了Mode.Delete和Mode.Until Gone。
Reaper什么都不做,可能是因为/ lock / calendar / uuid有孩子。
我错过了什么吗?我不需要清理这些锁吗?我需要明智地担心并发性。
答案 0 :(得分:2)
如果您使用最新的ZooKeeper 3.5.x和最新的Curator,Curator会对其所有配方使用“容器”节点,并根据需要自动清理这些节点。策展人的收割者已被弃用。
答案 1 :(得分:1)
InterProcessSemaphoreMutex创建其他子节点,例如租约,锁等。此特定类型锁的解决方法是在获取锁时向Reaper添加其他路径/lock/path/leases
,/lock/path/locks
等
答案 2 :(得分:0)
收割机的步骤必须如下。
Thread.wait(//time more than the threshold)
如果您现在检查zookeeper,该节点将被删除。
注意:这仅适用于路径为空的叶节点。
P.S:儿童收割机对我不起作用。如果您可以在评论或问题中提出您用于儿童收割机的步骤,那将会很有帮助。答案 3 :(得分:0)
Reaper不适用于InterprocessSemaphoreMutex,因为它会有子节点(锁,收据IIRC)。 ChildReaper部分工作,但后来开始抱怨失去父母。这是目前在2.7.1之后修复的已知错误(尚未发布)。解决方法是使用ChildReaper与InterprocessLock,如果可以重入入口。