我正在CuratorFrameworkFactory.newClient方法的帮助下创建一个Empheral节点,该方法采用znodes地址,sessiontimeoutinms,connectiontimeoutinms,Retry)。我传递了5 * 1000作为sessiontimeoutinms和15 * 1000作为connectiontimeoutinms。此方法能够在我的zookeeper中创建EPHEMERAL节点,但在应用程序运行之前不会删除此EPHEMERAL节点。
为什么会发生这种情况,因为sessiontimeout是5秒。
最可能的原因是Zookeeper(aka tickTime)的心跳设置较高,最小会话超时不能低于2 * tickTime。
调试时,创建一个临时节点时,请检查zkCli中的ephemeralOwner。值是会话ID。
当拥有该节点的客户端,在zookeeper日志中,你应该得到这一行:
INFO [ProcessThread(sid:0 cport:2182):: PrepRequestProcessor @ 486] - sessionid的已处理会话终止:0x161988b731d000c
在这种情况下,ephemeralOwener是0x161988b731d000c。如果你没有得到它,你会遇到一些错误。在我的情况下,它是EOF异常,这是因为客户端库和服务器不匹配。