Zookeeper客户端启动时,将创建2个线程:SendThread和EventThread。
在应用程序关闭时,我希望工作线程等待Zookeeper线程完成,但是在API中看不到任何合适的东西。

但是我只能调用ZooKeeper.close(),它将连接状态设置为CLOSED,并为EventThread排队“死亡事件”。
从ClientCnxn:

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


我想念什么吗?是否可以在不修改ZK客户端代码的情况下加入Zookeeper线程?

最佳答案

没有适当的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();

07-26 03:52