Example usage for org.apache.zookeeper WatchedEvent getPath

List of usage examples for org.apache.zookeeper WatchedEvent getPath

Introduction

In this page you can find the example usage for org.apache.zookeeper WatchedEvent getPath.

Prototype

public String getPath() 

Source Link

Usage

From source file:io.reign.ObserverManager.java

License:Apache License

void scheduleCheck(final WatchedEvent event) {
    final String path = event.getPath();

    // do not schedule a check if we have scheduled a check recently
    synchronized (observerScheduledCheckTimestampMap) {
        Long scheduledCheckTimestamp = observerScheduledCheckTimestampMap.get(path);
        if (scheduledCheckTimestamp != null) {
            long timeToCheck = scheduledCheckTimestamp - System.currentTimeMillis();
            if (timeToCheck > this.sweeperIntervalMillis / 2) {
                logger.trace(//from  www  . j  a va 2 s. c  om
                        "Ignoring:  re-check already scheduled:  path={}; eventType={}; timeToCheckMillis={}",
                        event.getPath(), event.getType(), timeToCheck);
                return;
            }
        }

        // update scheduled timestamp
        observerScheduledCheckTimestampMap.put(path, System.currentTimeMillis() + sweeperIntervalMillis);
    }

    logger.debug("Scheduling re-check after watch triggered:  path={}; eventType={}; timeToCheckMillis={}",
            event.getPath(), event.getType(), sweeperIntervalMillis);

    this.scheduledExecutorService.schedule(new Runnable() {

        @Override
        public void run() {
            try {
                // sync data to get most recent
                zkClientUtil.syncPath(zkClient, path, this);

                // fetch info about node
                Stat zkStat = zkClient.exists(path, true);
                Stat updatedStat = new Stat();
                byte[] zkData = zkClient.getData(path, true, updatedStat);
                List<String> zkChildList = zkClient.getChildren(path, true);

                Set<T> observerSet = getObserverSet(path, false);
                for (T observer : observerSet) {
                    List<String> observerChildList = observer.getChildList();
                    byte[] observerData = observer.getData();
                    if (zkStat != null) {
                        // check children
                        if (childListsDiffer(observerChildList, zkChildList)) {
                            observer.setChildList(zkChildList);
                            updateObserver(path, observer);
                            logger.warn("RECHECK:  NODE CHILDREN CHANGED:  updated={}; previous={}",
                                    zkChildList, observerChildList);
                            observer.nodeChildrenChanged(zkChildList, observerChildList);
                        }

                        // check data
                        if (!Arrays.equals(observerData, zkData)) {
                            observer.setData(zkData);
                            updateObserver(path, observer);
                            logger.warn("RECHECK:  NODE DATA CHANGED:  updated={}; previous={}", zkData,
                                    observerData);
                            observer.nodeDataChanged(zkData, observerData);
                            observer.nodeDataChanged(zkData, observerData, updatedStat);
                        }
                    } else {
                        // node deleted
                        observer.setData(null);
                        observer.setChildList(Collections.EMPTY_LIST);
                        observer.nodeDeleted(observerData, observerChildList);
                    }
                }
            } catch (Exception e) {
                logger.warn("Unable to check event:  path=" + path, e);
            }
        }

    }, this.sweeperIntervalMillis, TimeUnit.MILLISECONDS);

}

From source file:io.reign.ObserverManager.java

License:Apache License

@Override
public boolean filterWatchedEvent(WatchedEvent event) {
    if (event.getPath() != null && this.getObserverSet(event.getPath(), false).size() == 0) {
        // ignore events that are not being tracked by an observer
        return true;
    }//from   w  w w  . j  a va2s  . co  m
    return false;
}

From source file:io.reign.ObserverManager.java

License:Apache License

@Override
public void nodeChildrenChanged(final WatchedEvent event) {
    delegatorExecutorService.submit(new Runnable() {
        public void run() {
            String path = event.getPath();
            logger.debug("Notifying ALL observers:  nodeChildrenChanged:  path={}", path);
            try {
                Set<T> observerSet = getObserverSet(path, false);
                if (observerSet.size() > 0) {
                    List<String> updatedChildList = null;
                    try {
                        updatedChildList = zkClient.getChildren(path, true);
                    } catch (KeeperException e) {
                        if (e.code() != KeeperException.Code.NONODE) {
                            throw e;
                        }//ww w  .jav  a  2s  .com
                    }
                    if (updatedChildList == null) {
                        updatedChildList = Collections.EMPTY_LIST;
                    }

                    for (final T observer : observerSet) {

                        logger.trace("Notifying observer:  observer.hashCode()={}", observer.hashCode());

                        synchronized (observer) {
                            final List<String> previousChildList = observer.getChildList();
                            boolean updatedValueDiffers = childListsDiffer(updatedChildList, previousChildList);

                            observer.setChildList(updatedChildList);

                            updateObserver(path, observer);

                            if (updatedValueDiffers) {
                                observer.nodeChildrenChanged(updatedChildList, previousChildList);
                            }
                        }
                    } // for

                    scheduleCheck(event);

                } // if observerSet > 0
            } catch (KeeperException e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            } catch (Exception e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            }
        }
    });

}

From source file:io.reign.ObserverManager.java

License:Apache License

@Override
public void nodeCreated(final WatchedEvent event) {
    delegatorExecutorService.submit(new Runnable() {
        public void run() {
            String path = event.getPath();
            logger.debug("Notifying ALL observers:  nodeCreated:  path={}", path);
            try {
                Set<T> observerSet = getObserverSet(path, false);
                if (observerSet.size() > 0) {
                    // get children just to get a child watch
                    List<String> childList = zkClient.getChildren(path, true);
                    Stat updatedStat = new Stat();
                    byte[] data = zkClient.getData(path, true, updatedStat);

                    for (T observer : observerSet) {
                        logger.trace("Notifying observer:  observer.hashCode()={}", observer.hashCode());
                        synchronized (observer) {
                            byte[] previousData = observer.getData();
                            List<String> previousChildList = observer.getChildList();
                            observer.setData(data);
                            observer.setChildList(childList);

                            updateObserver(path, observer);

                            if (previousData == null && previousChildList == Collections.EMPTY_LIST) {
                                observer.nodeCreated(data, childList);
                                observer.nodeCreated(data, childList, updatedStat);
                            }/* w ww .jav a2 s . c  om*/
                        }
                    }

                    scheduleCheck(event);
                }
            } catch (KeeperException e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            } catch (Exception e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            }
        }
    });
}

From source file:io.reign.ObserverManager.java

License:Apache License

@Override
public void nodeDataChanged(final WatchedEvent event) {
    delegatorExecutorService.submit(new Runnable() {
        public void run() {
            String path = event.getPath();
            logger.debug("Notifying ALL observers:  nodeDataChanged:  path={}", path);
            try {
                Set<T> observerSet = getObserverSet(path, false);
                if (observerSet.size() > 0) {
                    Stat updatedStat = new Stat();
                    byte[] updatedData = zkClient.getData(path, true, updatedStat);
                    for (T observer : observerSet) {
                        logger.trace("Notifying observer:  observer.hashCode()={}", observer.hashCode());
                        synchronized (observer) {
                            if (!Arrays.equals(observer.getData(), updatedData)) {
                                byte[] previousData = observer.getData();
                                observer.setData(updatedData);

                                updateObserver(path, observer);

                                observer.nodeDataChanged(updatedData, previousData);
                                observer.nodeDataChanged(updatedData, previousData, updatedStat);
                            }/*  www .java2 s  .co  m*/
                        }
                    }

                    scheduleCheck(event);
                }
            } catch (KeeperException e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            } catch (Exception e) {
                logger.warn("Unable to notify observers:  path=" + path, e);
            }
        }
    });

}

From source file:io.reign.ObserverManager.java

License:Apache License

@Override
public void nodeDeleted(final WatchedEvent event) {
    delegatorExecutorService.submit(new Runnable() {
        public void run() {
            String path = event.getPath();
            logger.debug("Notifying ALL observers:  nodeDeleted:  path={}", path);

            Set<T> observerSet = getObserverSet(path, false);
            if (observerSet.size() > 0) {
                // set up watch for when path comes back if there are
                // observers
                try {
                    zkClient.exists(path, true);
                } catch (Exception e) {
                    logger.warn("Unable to set watch:  path=" + path, e);
                }/*ww  w. ja v  a2 s  .c om*/

                for (T observer : observerSet) {

                    logger.trace("Notifying observer:  observer.hashCode()={}", observer.hashCode());

                    synchronized (observer) {
                        byte[] previousData = observer.getData();
                        observer.setData(null);

                        List<String> previousChildList = observer.getChildList();
                        observer.setChildList(Collections.EMPTY_LIST);

                        updateObserver(path, observer);

                        if (previousChildList != observer.getChildList()
                                || previousData != observer.getData()) {
                            observer.nodeDeleted(previousData, previousChildList);
                        }
                    }
                }

                scheduleCheck(event);

            } // if observerSet>0
        }
    });
}

From source file:io.reign.Reign.java

License:Apache License

@Override
public void process(WatchedEvent event) {
    // log if TRACE
    if (logger.isTraceEnabled()) {
        logger.trace("***** Received ZooKeeper Event:  {}",
                ReflectionToStringBuilder.toString(event, ToStringStyle.DEFAULT_STYLE));

    }/*ww w.jav  a 2s.c om*/

    if (shutdown) {
        logger.warn("Already shutdown:  ignoring event:  type={}; path={}", event.getType(), event.getPath());
        return;
    }

    for (Watcher watcher : watcherList) {
        watcher.process(event);
    }
}

From source file:io.reign.zk.ResilientZkClient.java

License:Apache License

@Override
public void process(final WatchedEvent event) {
    /***** log event *****/
    // log if TRACE
    if (logger.isTraceEnabled()) {
        logger.trace("***** Received ZooKeeper Event:  {}",
                ReflectionToStringBuilder.toString(event, ToStringStyle.DEFAULT_STYLE));

    }/*from ww w  . j a v a 2 s.c  o m*/

    /***** pass notifications on to registered Watchers *****/
    // if (event.getType() != EventType.None) {
    if (shutdown) {
        logger.warn("Already shutdown:  not passing event to registered watchers:  type={}; path={}",
                event.getType(), event.getPath());
        return;
    } else {
        for (Watcher watcher : watcherSet) {
            watcher.process(event);
        }
    }
    // }

    /***** process events *****/
    switch (event.getType()) {
    case NodeChildrenChanged:
        this.childWatchesMap.remove(event.getPath());
        break;
    case NodeCreated:
    case NodeDataChanged:
    case NodeDeleted:
        this.dataWatchesMap.remove(event.getPath());
        break;
    case None:
        Event.KeeperState eventState = event.getState();
        if (eventState == Event.KeeperState.SyncConnected) {

            // this.connected = true;

            if (currentSessionId == null) {
                if (logger.isInfoEnabled()) {
                    logger.info(
                            "Restoring watches as necessary:  sessionId={}; connectString={}; sessionTimeout={}",
                            new Object[] { this.zooKeeper.getSessionId(), getConnectString(),
                                    getSessionTimeout() });
                }
                restoreWatches();
            }

            this.currentSessionId = this.zooKeeper.getSessionId();
            this.sessionPassword = this.zooKeeper.getSessionPasswd();

            logger.info("SyncConnected:  notifying all waiters:  currentSessionId={}; connectString={}",
                    currentSessionId, getConnectString());
            synchronized (this) {
                // notify waiting threads that connection has been
                // established
                this.notifyAll();
            }
            logger.info("SyncConnected:  notified all waiters:  currentSessionId={}; connectString={}",
                    currentSessionId, getConnectString());

        } else if (eventState == Event.KeeperState.Disconnected) {
            // this.connected = false;

        } else if (eventState == Event.KeeperState.Expired) {
            // expired session; close ZK connection and reconnect
            if (!this.shutdown) {
                // if session has been expired, clear out the existing ID
                logger.info(
                        "Session has been expired by ZooKeeper cluster:  reconnecting to establish new session:  oldSessionId={}; connectString={}",
                        currentSessionId, getConnectString());

                // null out current session ID
                this.currentSessionId = null;

                // do connection in another thread so as to not block the ZK event thread
                spawnReconnectThread();
            }

        } else {
            logger.warn("Unhandled state:  eventType=" + event.getType() + "; eventState=" + eventState);
        }
        break;
    default:
        logger.warn("Unhandled event type:  eventType=" + event.getType() + "; eventState=" + event.getState());
    }

}

From source file:io.reign.zk.ResilientZkClientWithCache.java

License:Apache License

@Override
public void nodeDeleted(WatchedEvent event) {
    String path = event.getPath();
    PathCacheEntry removed = pathCache.remove(path);
    if (removed != null) {
        logger.debug("Change detected:  removed cache entry:  path={}", path);
    }//from ww  w.  j  a va 2 s .  c o m
}

From source file:io.reign.zk.ResilientZkClientWithCache.java

License:Apache License

synchronized void handleNodeUpdate(WatchedEvent event) {
    String path = event.getPath();

    logger.info("Updating cache entry:  path={}; eventType={}", path, event.getType());

    try {//  w  w w.jav a2 s.  c o  m
        byte[] bytes = null;
        List<String> children = null;
        Stat stat = null;

        /** see what we have in cache **/
        PathCacheEntry cacheEntry = pathCache.get(path);
        if (cacheEntry != null) {
            bytes = cacheEntry.getData();
            children = cacheEntry.getChildList();
            stat = cacheEntry.getStat();
        }

        if (stat == null) {
            stat = new Stat();
        }

        /** get update data from zk **/
        if (event.getType() == EventType.NodeDataChanged || event.getType() == EventType.NodeCreated) {
            logger.debug("Change detected:  updating path data:  path={}", path);
            bytes = zkClient.getData(path, true, stat);

            if (cacheEntry == null) {
                children = zkClient.getChildren(path, true);
            }
        }

        if (event.getType() == EventType.NodeChildrenChanged || event.getType() == EventType.NodeCreated) {
            logger.debug("Change detected:  updating path children:  path={}", path);
            children = zkClient.getChildren(path, true);

            if (cacheEntry == null) {
                bytes = zkClient.getData(path, true, stat);
            }
        }

        /** update cache **/
        pathCache.put(path, stat, bytes, children);

    } catch (KeeperException e) {
        logger.error(this.getClass().getSimpleName() + ":  error while trying to update cache entry:  " + e
                + ":  path=" + path, e);
    } catch (InterruptedException e) {
        logger.warn(this.getClass().getSimpleName() + ":  interrupted while trying to update cache entry:  " + e
                + ":  path=" + path, e);
    }

}