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;
>>>>      }
>>>>    }
>>>> }
>>>> *
>>>>
>>>
>>>
>

Reply via email to