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();