Zookeeper getChildren 事件只触发一次
Zookeeper getChildren event is triggered only once
我在容器中有一个 Zookeeper 3.4 服务器,它侦听端口 2181。
每次从父节点添加或删除子节点时,我都想得到一个事件。
const zookeeper = require("node-zookeeper-client");
const client = zookeeper.createClient('localhost:2181');
function eventWatcher(event) {
console.log(event.getType());
}
(async () => {
client.connect();
client.once('connected', () => {
client.getChildren('/servers/live_nodes', eventWatcher, function (error, children, stat) {
if (error) {
console.log(error);
return;
}
});
});
})();
const zookeeper = require("node-zookeeper-client");
const client = zookeeper.createClient('localhost:2181');
//node removal code
client.remove("/servers/live_nodes/server1", (error) => {
if(error) {
console.error(error);
serverAlive = true;
}
});
//node creation code
client.create("/servers/live_nodes/server1", null, zookeeper.CreateMode.EPHEMERAL, (error) => {
if(error) {
console.error(error);
serverAlive = false;
}
});
只触发第一个事件。不会触发后续事件(adding/removing 来自 ./servers/live_nodes 的节点)。
Zookeeper 中的观察者是一次性触发器,因此您必须重新注册另一个才能获得另一个事件。
像这样应该可以解决问题,但有些事件可能会丢失:
function eventWatcher(event) {
client.getChildren('/servers/live_nodes', eventWatcher, function (error,children, stat) {
if (error) {
console.log(error);
return;
}
});
}
client.getChildren('/servers/live_nodes', eventWatcher, function (error,children, stat) {
if (error) {
console.log(error);
return;
}
});
有关更多信息,请查看 this question。
我在容器中有一个 Zookeeper 3.4 服务器,它侦听端口 2181。 每次从父节点添加或删除子节点时,我都想得到一个事件。
const zookeeper = require("node-zookeeper-client");
const client = zookeeper.createClient('localhost:2181');
function eventWatcher(event) {
console.log(event.getType());
}
(async () => {
client.connect();
client.once('connected', () => {
client.getChildren('/servers/live_nodes', eventWatcher, function (error, children, stat) {
if (error) {
console.log(error);
return;
}
});
});
})();
const zookeeper = require("node-zookeeper-client");
const client = zookeeper.createClient('localhost:2181');
//node removal code
client.remove("/servers/live_nodes/server1", (error) => {
if(error) {
console.error(error);
serverAlive = true;
}
});
//node creation code
client.create("/servers/live_nodes/server1", null, zookeeper.CreateMode.EPHEMERAL, (error) => {
if(error) {
console.error(error);
serverAlive = false;
}
});
只触发第一个事件。不会触发后续事件(adding/removing 来自 ./servers/live_nodes 的节点)。
Zookeeper 中的观察者是一次性触发器,因此您必须重新注册另一个才能获得另一个事件。
像这样应该可以解决问题,但有些事件可能会丢失:
function eventWatcher(event) {
client.getChildren('/servers/live_nodes', eventWatcher, function (error,children, stat) {
if (error) {
console.log(error);
return;
}
});
}
client.getChildren('/servers/live_nodes', eventWatcher, function (error,children, stat) {
if (error) {
console.log(error);
return;
}
});
有关更多信息,请查看 this question。