java - 即使达到超时限制,Zookeeper 也不会使 session 过期

标签 java apache-zookeeper

我在程序中观察到一个奇怪的问题,我正在使用单个独立的动物园管理员并尝试为客户端模拟 session 过期事件。现在,据我阅读文档并搜索互联网,我相信事件链如下进行。客户端连接到服务器并接收协商的超时,如果在超时期间没有从客户端接收到心跳,服务器将使 session 过期,即使客户端重新连接,它也会抛出 session 过期异常。现在为了模拟这一点,我已经编写了下面的一段代码但不知何故它工作得很好,并且没有抛出 session 过期异常。

    String path = "/SessionId3";
            ZooKeeper zoo;
            final CountDownLatch connectedSignal = new CountDownLatch(1);
            zoo = new ZooKeeper("localhost:2182", 5000, new Watcher() {

                public void process(WatchedEvent we) {
                    if (we.getState() == KeeperState.SyncConnected) {
                        System.out.println("in connected state");
                        connectedSignal.countDown();
                    }
                    if (we.getState() == KeeperState.Disconnected) {
                        System.out.println("in disconnected state");
                        connectedSignal.countDown();
                    }
                    if (we.getState() == KeeperState.Expired) {
                        System.out.println("in expired state");
                        connectedSignal.countDown();
                    }
                    if (we.getType() == Event.EventType.None) {
                        connectedSignal.countDown();
                    }
                }
            });

            System.out.println("in watcher");
            connectedSignal.await();
            long sId = zoo.getSessionId();
            System.out.println("sessionId=" + sId);
            byte[] sPwd = zoo.getSessionPasswd();
            System.out.println("session password=" + Arrays.toString(sPwd));
            long sTimeout=zoo.getSessionTimeout();
            System.out.println("agreed upon session timeout=" +sTimeout);   
            zoo.create(path,null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
            byte[] data=zoo.getData(path, new Watcher()
                    {
                public void process(WatchedEvent we)
                {
                    if(we.getType()==Event.EventType.NodeDeleted)
                    {
                        System.out.println("node deleted");
                    }
                }
                    }, null);
            System.out.println("disconnect from zookeeper servers.");
//here i kill my zookeeper server to make client disconnect
            Thread.sleep(30000);
            System.out.println("session must have expired...");
            Thread.sleep(10000);
            System.out.println("after sleep awakening");
//starting zookeeper server again to emulate reconnect
            Thread.sleep(10000);

            Stat stat = zoo.exists(path, false); //expected to get session expired exception but works fine?
    if (stat != null) 
            {System.out.println("fetching children");
                List<String> children=zoo.getChildren(path, false);
                for(String child:children)
                {
                    System.out.println(child);
                    byte[] b = zoo.getData(path+"/"+child, false, null);
                    String dataInString = new String(b, "UTF-8");
                    System.out.println(dataInString);
                }

            } else 
            {
                System.out.println("Node does not exists");
            }   
            zoo.close();//triggers the watch set on ephemeral node 

        } 

我还有一个标准的zoo.cfg 文件,它与zookeeper 一起提供。我做错了什么以及为什么我的 session 永远不会过期?

最佳答案

好吧,我发现了这个问题(我猜)。问题似乎是,当我依次关闭zookeeper服务器以模拟 session 过期并且客户端继续重新连接时,但我错过的一点是zookeeper服务器管理 session 过期,当我关闭它并再次打开它时一段时间后,它会恢复客户端从关闭时尝试连接的 session 时间,这就是 session 似乎永远不会过期的原因。为了证明,我尝试了另一台机器上的客户端代码,然后关闭其连接,同时保持动物园管理员服务器始终处于运行状态,一段时间后再次重新连接客户端,并且繁荣在默认观察者中收到了 session 过期通知,并得到了 session 过期异常。 .

关于java - 即使达到超时限制,Zookeeper 也不会使 session 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54825180/

相关文章:

java - ftp 文件检索未完成的文件

go - 由于 "Authentication failed: EOF",Mesos 框架保持不活动状态

java - Zookeeper cfg 文件 - 为什么有多个端口?

python - 如何使用Python正则表达式处理zookeeper日志文件?

java - 如何监控 Kafka 消息的应用程序处理以进行负载测试

apache-zookeeper - 共识服务与锁定服务?

java - 默认最大 Permgen 大小是如何定义的 :

java - Eclipse 无法安装ADT

java - 从 onClick(DialogInterface 对话框) 执行 AsyncTask

java - 如何在 Java 上断开字符串?