Hi all, Here's DisconnectedTimeoutHandler sample code. I thought Session Expired is similar DisconnectedTimeoutHandler.
*public class WatcherTest implements Watcher { private static final String ZK_HOSTS = "127.0.0.1:2181,127.0.0.1:2182, 127.0.0.1:2183"; private static final int ZK_SESSION_TIMEOUT = 10 * 1000; private ZooKeeper zk; DisconnectedTimeoutHandler timeoutHandler; private WatcherTest() throws Exception { timeoutHandler = new DisconnectedTimeoutHandler(this, ZK_SESSION_TIMEOUT); zk = new ZooKeeper(ZK_HOSTS, ZK_SESSION_TIMEOUT, this); timeoutHandler.start(); } private void exec() { while(true) { try { Thread.sleep(5 * 1000); // long sid = zk.getSessionId(); // byte[] passwd = zk.getSessionPasswd(); // zk.close(); // zk = new ZooKeeper(ZK_HOSTS, ZK_SESSION_TIMEOUT, this, sid, passwd); } catch (Exception e) { e.printStackTrace(); } } } @Override public void process(WatchedEvent event) { if (event.getType() == Event.EventType.None) { switch (event.getState()) { case SyncConnected: timeoutHandler.disconnected(false); System.out.println("ZK SyncConnected"); break; case Disconnected: timeoutHandler.disconnected(true); System.out.println("ZK Disconnected"); break; case Expired: System.out.println("ZK Session Expired"); shutdown(); break; } } } private void shutdown() { System.exit(0); } public static void main(String[] args) throws Exception { WatcherTest test = new WatcherTest(); test.exec(); } } class DisconnectedTimeoutHandler extends Thread { private boolean disconnected = false; private long lastDisconnectedTime; private long timeout; private Watcher watcher; public DisconnectedTimeoutHandler(Watcher watcher, long timeout) { this.watcher = watcher; this.timeout = timeout; } public synchronized void disconnected(boolean disconnected) { if(!this.disconnected && disconnected) { this.lastDisconnectedTime = System.currentTimeMillis();; } this.disconnected = disconnected; synchronized(this) { this.notify(); } } public void start() { while(true) { synchronized(this) { try { this.wait(); } catch (InterruptedException e) { } } while(disconnected) { if(System.currentTimeMillis() - lastDisconnectedTime >= timeout) { watcher.process(new WatchedEvent(Watcher.Event.EventType.None, Watcher.Event.KeeperState.Expired, null)); disconnected = false; lastDisconnectedTime = 0; } try { Thread.sleep(1000); } catch (InterruptedException e) { break; } } } } }* 2010/2/9 neptune <opennept...@gmail.com> > I saw that wiki page. And I read this paragraph "It means that the client > was partitioned off from the ZooKeeper service for more the the session > timeout ..." > That's why I use Expired event for cluster membership. In my case client is > a node in a cluster. > > 2010/2/9 Patrick Hunt <ph...@apache.org> > > this? "How should I handle SESSION_EXPIRED?" >> http://wiki.apache.org/hadoop/ZooKeeper/FAQ#A3 >> >> >> Benjamin Reed wrote: >> >>> i was looking through the docs to see if we talk about handling session >>> expired, but i couldn't find anything. we should probably open a jira to add >>> to the docs, unless i missed something. did i? >>> >>> ben >>> >>> -----Original Message----- >>> From: Mahadev Konar [mailto:maha...@yahoo-inc.com] Sent: Monday, >>> February 08, 2010 2:43 PM >>> To: zookeeper-user@hadoop.apache.org >>> Subject: Re: When session expired event fired? >>> >>> Hi, >>> a zookeeper client does not expire a session until and unless it is able >>> to >>> connect to one of the servers. In your case if you kill all the servers, >>> the >>> client is not able to connect to any of the servers and will keep trying >>> to >>> connect to the three servers. It cannot expire a session on its own and >>> needs to hear from the server to know if the session is expired or not. >>> >>> Does that help? >>> Thanks >>> mahadev >>> >>> >>> On 2/8/10 2:37 PM, "neptune" <opennept...@gmail.com> wrote: >>> >>> Hi all. >>>> I have a question. I started zookeeper(3.2.2) on three servers. >>>> When session expired event fired in following code? >>>> I expected that if client can't connect to server(disconnected) for >>>> session >>>> timeout, zookeeper fires session expired event. >>>> I killed three zookeeper server sequentially. Client retry to connect >>>> zookeeper server. Never occured Expired event. >>>> >>>> *class WatcherTest { >>>> public static void main(String[] args) { >>>> (new **WatcherTest*()).exec(); >>>> * } >>>> >>>> private WatcherTest() throws Exception { >>>> zk = new ZooKeeper("server1:2181,server2:2181:server3:2181", 10 * >>>> 1000, >>>> this); >>>> } >>>> private void exec() { >>>> while(ture) { >>>> //do something >>>> } >>>> } >>>> public void process(WatchedEvent event) { >>>> if (event.getType() == Event.EventType.None) { >>>> switch (event.getState()) { >>>> case SyncConnected: >>>> System.out.println("ZK SyncConnected"); >>>> break; >>>> case Disconnected: >>>> System.out.println("ZK Disconnected"); >>>> break; >>>> case Expired: >>>> System.out.println("ZK Session Expired"); >>>> System.exit(0); >>>> break; >>>> } >>>> } >>>> } >>>> * >>>> >>> >>> >