Функция обратного вызова вызывается только один раз - PullRequest
0 голосов
/ 30 сентября 2018

Я пишу клиент ZooKeeper для мониторинга узла.Функция обратного вызова вызывается только при первом изменении данных узла.Я не уверен, почему функция не выполняется при втором изменении.

Второй запрос - моя программа завершается, если я раскомментирую последнюю функцию close().В качестве хорошей практики я должен использовать функцию close(), но тогда она не переходит в состояние блокировки для прослушивания входящих событий.Как мне этого добиться?Я прочитал документацию, но не смог найти ничего полезного.

var zookeeper = require("node-zookeeper-client");

var client = zookeeper.createClient("192.168.43.172:2181");
var path = process.argv[2];

client.once("connected", function() {
  console.log("Connected to the server.");
  client.create(path, new Buffer("data"), function(error) {
    if (error) {
      console.log("Failed to create node: %s due to: %s.", path, error);
    } else {
      console.log("Node: %s is successfully created.", path);
    }
  });

  client.getData(
    path,
    function(event) {
      console.log("Got event: %s.", event);
    },
    function(error, data, stat) {
      if (error) {
        console.log(error.stack);
        return;
      }
      console.log("Got data: %s", data.toString("utf8"));
    }
    );
  //client.close();
});

client.connect();

1 Ответ

0 голосов
/ 03 октября 2018

У меня до сих пор нет ответа на мой второй запрос, но для первого запроса сервер zookeeper предназначен для отправки события только в первый раз, когда происходит изменение, а затем для удаления переключателя.Чтобы продолжать получать события, мне пришлось снова установить часы при обработке сработавшего события.Ниже мой код:

var zookeeper = require("node-zookeeper-client");

var client = zookeeper.createClient("192.168.43.172:2181");
var path = process.argv[2];

client.once("connected", function() {
  console.log("Connected to the server.");

  var watch = function(event) {
    console.log("Got event: %s.", event);
    client.getData(path, watch, getDat);
  };

  var getDat = function(error, data, stat) {
    if (error) {
      console.log(error.stack);
      return;
    }
    console.log("Got data: %s", data.toString("utf8"));
  };

  client.getData(path, watch, getDat);
  // client.close();
});

client.connect();
...