等待Zookeeper客户端线程停止

zujrkrfu  于 2022-12-09  发布在  Apache
关注(0)|答案(1)|浏览(779)

Zookeeper客户端启动时,它会创建2个线程:SendThreadEventThread中的一个或多个。
在应用程序关闭时,我希望工作线程等待Zookeeper线程完成,但在API中看不到任何合适的东西。
然而,我只能调用ZooKeeper.close(),它将连接状态设置为CLOSED,并为EventThread排队“死亡事件”。
从客户端Cnxn:

public void disconnect() {    
    this.sendThread.close();
    this.eventThread.queueEventOfDeath();
}

我错过了什么吗?有没有办法在不修改ZK客户端代码的情况下加入Zookeeper线程?

chy5wohz

chy5wohz1#

不存在适当的API,因此最后不得不使用反射来实现:

Field cnField = ZooKeeper.class.getDeclaredField("cnxn");
        cnField.setAccessible(true);
        ClientCnxn cnxn = (ClientCnxn) cnField.get(zoo);
        Field sendField = ClientCnxn.class.getDeclaredField("sendThread");
        sendField.setAccessible(true);
        Field eventField = ClientCnxn.class.getDeclaredField("eventThread");
        eventField.setAccessible(true);
        Thread sendThread = (Thread) sendField.get(cnxn);
        Thread eventThread = (Thread) eventField.get(cnxn);
        sendThread.join();
        eventThread.join();

相关问题