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