【发布时间】:2020-02-25 00:42:56
【问题描述】:
请在创建空白/test/a 路径后对您的 Zookeeper 服务器运行以下命令。
import static java.lang.String.valueOf;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.RetryForever;
public class CacheUpdateTest {
static final String connectString = "127.0.0.1:2181,127.0.0.1:2191,127.0.0.1:2201";
static volatile boolean stop = false;
public static void main(String[] args) throws Exception {
new Listener().start();
Thread.sleep(1000);
new Updater().start();
}
private static class Listener extends Thread {
@SuppressWarnings("resource")
@Override
public void run() {
CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectString).retryPolicy(new RetryForever(100)).build();
client.start();
PathChildrenCache cache = new PathChildrenCache(client, "/test", true);
cache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
if (event.getData() == null || event.getData().getData() == null) return;
int newI = Integer.parseInt(new String(event.getData().getData()));
System.err.println("Sensed update: " + newI);
}
});
try {
cache.start(StartMode.BUILD_INITIAL_CACHE);
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static class Updater extends Thread {
@Override
public void run() {
try {
CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectString).retryPolicy(new RetryForever(100)).build();
client.start();
for (int i = 0; i < 10; i++) {
// Thread.sleep(100);
System.out.println("Updated child: " + i);
client.setData().forPath("/test/a", valueOf(i).getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
如果我取消注释 Thread.sleep(100) 行,我通常会得到以下输出
Updated child: 0
Sensed update: 0
Updated child: 1
Sensed update: 1
Updated child: 2
Sensed update: 2
Updated child: 3
Sensed update: 3
Updated child: 4
Sensed update: 4
Updated child: 5
Sensed update: 5
Updated child: 6
Sensed update: 6
Updated child: 7
Sensed update: 7
Updated child: 8
Sensed update: 8
Updated child: 9
Sensed update: 9
当我评论它时,我得到以下输出
Updated child: 0
Updated child: 1
Sensed update: 1 --> Missed 0
Updated child: 2
Updated child: 3
Updated child: 4
Sensed update: 3 --> Missed 2
Updated child: 5
Updated child: 6
Sensed update: 5 --> Missed 4
Updated child: 7
Updated child: 8
Sensed update: 7 --> Missed 6
Updated child: 9
Sensed update: 9 --> Missed 8
为什么我并不总是收到所有通知?为什么我没有错过第一个?
【问题讨论】:
标签: apache-zookeeper apache-curator