2

我想问一个关于处理 SUSPEND 状态的问题。

这是背景:

我正在使用 curator/zk 作为并发运行作业列表的任务协调器。每分钟,每个工作人员(每个工作都在单独的 VM 上运行)尝试通过调用从 zk 获取任务(锁):

lock = new InterProcessSemaphoreMutex(zkClient, task); 
boolean hasLock = false;
hasLock = lock.acquire(1, TimeUnit.SECONDS);

如果工作获得锁,它将执行任务。

负责检索器锁/任务的类实现 ConnectionStateListener 接口。以下是当前的实现:

  • RECONNECT:什么都不做,因为无论 ZK 连接状态如何,worker 都会尝试获取锁。

  • LOST:释放锁,因为连接丢失。

  • 暂停:??????

我的问题是关于 SUSPEND 状态,我应该在进入 SUSPEND 时释放锁(基本上,视为丢失)还是做其他事情?

处理 SUSPEND 状态的最佳实践是什么?

谢谢,

4

1 回答 1

2

我猜你已经看到了本页末尾的评论。

强烈建议您添加 ConnectionStateListener 并注意 SUSPENDED 和 LOST 状态更改。如果报告了 SUSPENDED 状态,除非您随后收到 RECONNECTED 状态,否则您无法确定您仍然持有锁。如果报告了 LOST 状态,则可以确定您不再持有锁。

我将其解释为:您持有锁,直到您收到一个RECONNECTED状态,除非您的连接是LOST并且锁被释放。

于 2015-01-30T16:16:05.117 回答