- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我能够成功锁定 /ads/lock/0-test1
然后无法锁定 /ads/lock
我该如何解决这个问题?
InterProcessMutex lock1 = new InterProcessMutex(client, "/ads/lock/0-test1");
if(lock1.acquire(30000, TimeUnit.MILLISECONDS)){
InterProcessMutex lock2 = new InterProcessMutex(client, "/ads/lock");
if(lock2.acquire(30000, TimeUnit.MILLISECONDS)) { //Failing
...
}
}
更新:这是https://github.com/Microsoft/Cluster-Partition-Rebalancer-For-Kafka/ZookeeperBackedAdoptionLogicImpl.java中发生的事情的本质。第 250 行(详细路径)和第 299 行(根路径)的锁是顺序的。因此,当另一个实例尝试锁定详细路径 (250) 时,锁定失败,因为根路径 (299) 已被锁定。逻辑有效,但根锁始终未获取
更新 2:我写了一个小程序来检查重叠锁是否有效,确实有效。
public class LockTesting {
public static final String ROOT_LOCK = "/locks";
public static final String CHILD_LOCK = ROOT_LOCK+"/child";
private static CuratorFramework client;
public static void main(String[] args) throws Exception {
client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 30));
client.start();
InterProcessMutex lock1 = new InterProcessMutex(client, CHILD_LOCK);
if (lock1.acquire(30000, TimeUnit.MILLISECONDS)) {
System.out.println("Child Locked");
InterProcessMutex lock2 = new InterProcessMutex(client, ROOT_LOCK);
if (lock2.acquire(30000, TimeUnit.MILLISECONDS)) {
System.out.println("Root Locked");
}
}
}
}
最佳答案
虽然没有明确记录(但请参阅 technote 7 ),馆长用来创建锁的机制取决于特定 znode 路径的子节点。 InterProcessMutex
是 zookeeper lock recipe 的一个实现,其文档确实包含这些详细信息。通过尝试使用这样的分层结构,您实际上是在弄乱锁的内部结构。
锁定路径应被视为一个“对象”,其内部 znode 不可访问且可能会发生变化。
响应更新
有问题的代码确实是这种不当使用的一个例子。
响应 Update2
是的,它有时可以工作。但这取决于 InterProcessMutex
实现的内部细节。您会发现,对于某些锁名称,这会起作用,而对于其他锁名称,则不会起作用,否则您会出现未定义的行为。
关于java - Curator Hierarchy Locking(重叠锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932695/
有没有一种方法可以让我使用 Curator 来观察领导层的变化?当领导者改变时,我需要所有的追随者都知道这已经发生了,这样他们才能发现新的领导者是谁。追随者想知道领导者是谁,这似乎是一种标准,但我无法
给CuratorFrameworkFactory#newClient的连接字符串如何看起来像?到目前为止,我还没有在网上找到任何信息,JavaDoc 也没有告诉我正确的格式。 最佳答案 根据 this
本文整理了Java中org.apache.flink.shaded.curator.org.apache.curator.utils.ZKPaths类的一些代码示例,展示了ZKPaths类的具体用法。
本文整理了Java中org.apache.flink.shaded.curator.org.apache.curator.utils.ZKPaths.getNodeFromPath()方法的一些代码示
本文整理了Java中org.apache.flink.shaded.curator.org.apache.curator.utils.ZKPaths.deleteChildren()方法的一些代码示例
我正在尝试来自策展人的基本代码 http://curator.readthedocs.io/en/4.0/examples.html 我尝试 import elasticsearch import c
只是想知道是否有任何 API 可以使用 Curator Framework 中的 CuratorFramework 类来知道特定节点是领导者。我正在使用 LeaderLatch,但即使 Node 是领
Apache Curator library for ZooKeeper 使用了一个很好的“流畅”语法。例如,要修改事务中的多个节点,代码如下所示: client.inTransaction().
我正在尝试使用CLI探索Elasticsearch策展人 https://www.elastic.co/guide/en/elasticsearch/client/curator/current/in
使用Elasticsearch策展人,如何删除与模式匹配的所有索引,但最新的除外? 我尝试使用filtertype: age,但似乎无法满足我的需要。 最佳答案 您需要两个过滤器:pattern(以匹
我想删除超过 7 天的 Elasticsearch 索引。所以我安装了curator 4.2,因为我的elasticsearch版本是5.0.0(4.x之前的curator版本与elasticsear
场景: 使用Curator实现分布式互斥体。如果已经获取互斥量的客户端由于网络故障而与 zk 服务器断开连接,则 Curator 将尝试重新连接。假设最终重连成功,但是最后一个 session 已经过
我创建了一个 Curator 客户端,如下所示: RetryPolicy retryPolicy = new RetryNTimes(3, 1000); CuratorFramewor
创建路径时,我在以下代码中收到 NodeExists 错误。 CuratorTransaction transaction = curatorFramework.inTransaction(); tr
我已将 Curator 设置为通过此过滤器删除旧的 Elasticsearch 索引: (...) filters: - filtertype: pattern kind: regex val
我正在尝试测试 Apache Curator 中的可撤销锁定。我有两个尝试获取锁的线程。如果第一个测试获取了锁,第二个线程可以要求第一个线程释放锁,以便第二个线程可以获取它 Retry
我目前正在使用 Apache Curator 来外部化共享资源(数据库中的一行)的锁定。总结一下这个问题,我正在运行一个服务的 2 个实例(使用 Spring Boot),我们将其称为服务 A,并调用
我知道 Apache Curator 可以实现基于 zookeeper 的分布式锁功能。根据 Apache Curator 官方网站上发布的文档,它看起来非常容易使用。例如: RetryPolicy
本文整理了Java中org.apache.curator.utils.ZKPaths类的一些代码示例,展示了ZKPaths类的具体用法。这些代码示例主要来源于Github/Stackoverflow/
本文整理了Java中com.bazaarvoice.curator.dropwizard.ZooKeeperConfiguration类的一些代码示例,展示了ZooKeeperConfiguratio
我是一名优秀的程序员,十分优秀!