`
liudunxu2
  • 浏览: 30826 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

zkclient的事件驱动实现

 
阅读更多

zkclient通过BlockingQueue实现多线程的事件驱动,当zkClient对象构造时,调用connect方法启动eventthread线程,eventthread线程的run实现如下:

 @Override
    public void run() {
        LOG.info("Starting ZkClient event thread.");
        try {
            while (!isInterrupted()) {
                ZkEvent zkEvent = _events.take();
                int eventId = _eventId.incrementAndGet();
                LOG.debug("Delivering event #" + eventId + " " + zkEvent);
                try {
                    zkEvent.run();
                } catch (InterruptedException e) {
                    interrupt();
                } catch (ZkInterruptedException e) {
                    interrupt();
                } catch (Throwable e) {
                    LOG.error("Error handling event " + zkEvent, e);
                }
                LOG.debug("Delivering event #" + eventId + " done");
            }
        } catch (InterruptedException e) {
            LOG.info("Terminate ZkClient event thread.");
        }
    }

由zkClient对象调用thread的send方法向blockingqueue中写入一个ZkEvent,zkEvent本身是一个抽象类,zkClient通过实现其中的run方法,实现不同的业务功能,zkClient对象内部保存一个Map<String, Set<IZkChildListener>> _childListener作为观察者模式的listener。ZkEvent内部实现主要调用listener实现不同的方法。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics