我正在使用节点-动物园管理员-客户端为java脚本作为一个动物园管理员客户端。
我有这样的事情:
const setWatch = (path, functionToExecuteOnTrigger) => {
client.getData(path, (event) => {
// watcher set here
functionToExecuteOnTrigger(event);
}, null)
// null because we are only setting watch here and do not need data
}这个函数将在动物园管理员的path上设置一个手表。一旦触发手表,将调用观察者回调,并调用要在手表上调用的适当函数。
对于像这样的手表:
setWatch('/data1', function1);
setWatch('/data2', function2);因此,function1是针对在data1节点中触发的手表执行的,function2是针对在data2节点中触发的表执行的。
现在,如果我必须持续监视节点,以便每次发生更改时,我将不得不在触发表后立即重新注册:
const setWatch = (path, functionToExecuteOnTrigger) => {
client.getData(path, (event) => {
// watcher set here
// immediately set another watch for the same function
setWatch(path, functionToExecuteOnTrigger);
functionToExecuteOnTrigger(event);
}, null)
// null because we are only setting watch here and do not need data
}现在,我对动物园管理员手表的了解如下:
由于上面提到的第二点,有可能在手表触发期间和重新注册手表之间发生丢失的更改。如动物园饲养员的正式文件所述。
因此,我想知道是否有一种方法可以为同一个节点设置多个手表(以队列的方式),每次触发手表时,只调用一个触发器回调。就像这样:
setWatch(node, functionToTrigger, noOfWatchesInQueue)因此,我们将为同一节点设置多个监视,对于触发器,只触发其中的一个。因此,如果我在队列中为同一个节点设置了3个手表,即
对于触发器1,watch1被激活
为了触发2,看2等等.
这样,在重新注册手表所需的时间内,就不会错过任何事件。
有什么办法可以得到这个吗?我不知道是否已经在某个地方完成了这项工作,任何关于这个问题的研究材料或实现都会有帮助。
发布于 2018-01-02 09:47:39
没有办法用一个操作在同一个节点上设置多个监视。这是故意的。
正如您所提到的,(以及根据文档),您只能在读取节点的值时设置一个手表。通过这种方式,您将始终拥有一个节点的最新值,并在节点更改时通知它。这是ZK提供的,而不是更多。
动物园管理员手表不是事件队列,也不能保证您会接收到每一个事件。
我认为更好的做法是描述您的用例,并试图为实现它的最佳工具找到答案,因为ZK可能不合适。
发布于 2017-12-22 06:50:38
我认为你应该做以下几件事:
这样,您将始终知道znode的最新版本,并将在今后的更改中得到通知。还请注意,每个znode都有版本号--您可以轻松地检查它是否已更改。
https://stackoverflow.com/questions/47924402
复制相似问题