I > > > org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1115) > > > > > > > > Caused by: java.lang.ClassNotFoundException: > > org.apache.zookeeper.server.ZooTrace MG>put zookeeper*.jar on CLASSPATH
> > > at > > > org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711) > > > > > > > > at > > org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) > > > ... 1 more > > > > > > > > > > > > > > > at the same time,the following is also in catalina.out: > > > > > > > > > > > > INFO: Illegal access: this web application instance has been > > > stopped already. Could not load > > > org.apache.zookeeper.server.ZooTrace. The eventual following stack > > > trace is caused by an error thrown for debugging purposes as well > > > as to attempt to terminate the thread which caused the illegal > > > access, and has no functional impact. > > > java.lang.IllegalStateException at > > > org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1597) > > > > > > > > at > > org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) > > > at > > > org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1115) > > > > > > > > > > > > > > > I searched google and mail list ,couldn't find any solution,please > > > help me. > > > > > > > > > Enviroment info: > > > > > > JDK:1.6.0_45 > > > > > > Tomcat:7.0.40 > > > > > > Zookeeper:3.4.5 > > > > Can you give us any more of the stack trace? It looks like this is > > happening during shutdown, but all the ServletContextListeners should > > complete before the WebappClassLoader starts shedding its loaded classes. > > > > Are you explicitly shutting-down the ClientCnxn thread in a SCL's > > destroy() method? If not, you need to do that. > > > > Sorry,I can't get any more of the stack trace. > > We wrapped zookeepr client as a spring bean and invoked method "close" of > zookeeper in "destory-method" of bean,in that method "close",zookeeper Send > Thread was closed. > When tomcat was shut down, Spring closed it's container and bean was > detroyed, then "destroy-method" of bean was invoked. > I'am confusing why is Send Thread of Zookeeper seemed to exit slower than > the WebappClassLoader shedding its loaded classes. > > ps: details of zookeeper closing > org.apache.zookeeper.Zookeeper > public synchronized void close() throws InterruptedException { > if (!cnxn.getState().isAlive()) { > if (LOG.isDebugEnabled()) { > LOG.debug("Close called on already closed client"); > } > return; > } > if (LOG.isDebugEnabled()) { > LOG.debug("Closing session: 0x" + > Long.toHexString(getSessionId())); > } > try { > cnxn.close(); > } catch (IOException e) { > if (LOG.isDebugEnabled()) { > LOG.debug("Ignoring unexpected exception during close", e); > } > } > LOG.info("Session: 0x" + Long.toHexString(getSessionId()) + " > closed"); > } > ---------------------------------------------------------------------------------------------------------------------- > org.apache.zookeeper.ClientCnxn > public void close() throws IOException { > if (LOG.isDebugEnabled()) { > LOG.debug("Closing client for session: 0x" > + Long.toHexString(getSessionId())); > } > try { > RequestHeader h = new RequestHeader(); > h.setType(ZooDefs.OpCode.closeSession); > submitRequest(h, null, null, null); > } catch (InterruptedException e) { > // ignore, close the send/event threads > } finally { > disconnect(); > } > } > > > public void disconnect() { > if (LOG.isDebugEnabled()) { > LOG.debug("Disconnecting client for session: 0x" > + Long.toHexString(getSessionId())); > } > sendThread.close(); > eventThread.queueEventOfDeath(); > } > ------------------------------------------------------------------------------------------------- > > > org.apache.zookeeper.ClientCnxn.SendThread > void close() { > state = States.CLOSED; > clientCnxnSocket.wakeupCnxn(); > } > > > @Override > public void run() { > clientCnxnSocket.introduce(this,sessionId); > clientCnxnSocket.updateNow(); > clientCnxnSocket.updateLastSendAndHeard(); > int to; > long lastPingRwServer = System.currentTimeMillis(); > while (state.isAlive()) { > try { > if (!clientCnxnSocket.isConnected()) { > if(!isFirstConnect){ > try { > Thread.sleep(r.nextInt(1000)); > } catch (InterruptedException e) { > LOG.warn("Unexpected exception", e); > } > } > // don't re-establish connection if we are closing > if (closing || !state.isAlive()) { > break; > } > startConnect(); > clientCnxnSocket.updateLastSendAndHeard(); > } > if (state.isConnected()) { > // determine whether we need to send an AuthFailed > event. > if (zooKeeperSaslClient != null) { > boolean sendAuthEvent = false; > if (zooKeeperSaslClient.getSaslState() == > ZooKeeperSaslClient.SaslState.INITIAL) { > try { > > zooKeeperSaslClient.initialize(ClientCnxn.this); > } catch (SaslException e) { > LOG.error("SASL authentication with > Zookeeper Quorum member failed: " + e); > state = States.AUTH_FAILED; > sendAuthEvent = true; > } > } > KeeperState authState = > zooKeeperSaslClient.getKeeperState(); > if (authState != null) { > if (authState == KeeperState.AuthFailed) { > // An authentication error occurred > during authentication with the Zookeeper Server. > state = States.AUTH_FAILED; > sendAuthEvent = true; > } else { > if (authState == > KeeperState.SaslAuthenticated) { > sendAuthEvent = true; > } > } > } > if (sendAuthEvent == true) { > eventThread.queueEvent(new WatchedEvent( > Watcher.Event.EventType.None, > authState,null)); > } > } > to = readTimeout - clientCnxnSocket.getIdleRecv(); > } else { > to = connectTimeout - clientCnxnSocket.getIdleRecv(); > } > > if (to <= 0) { > throw new SessionTimeoutException( > "Client session timed out, have not heard > from server in " > + clientCnxnSocket.getIdleRecv() + > "ms" > + " for sessionid 0x" > + Long.toHexString(sessionId)); > } > if (state.isConnected()) { > int timeToNextPing = readTimeout / 2 > - clientCnxnSocket.getIdleSend(); > if (timeToNextPing <= 0) { > sendPing(); > clientCnxnSocket.updateLastSend(); > } else { > if (timeToNextPing < to) { > to = timeToNextPing; > } > } > } > // If we are in read-only mode, seek for read/write server > if (state == States.CONNECTEDREADONLY) { > long now = System.currentTimeMillis(); > int idlePingRwServer = (int) (now - lastPingRwServer); > if (idlePingRwServer >= pingRwTimeout) { > lastPingRwServer = now; > idlePingRwServer = 0; > pingRwTimeout = > Math.min(2*pingRwTimeout, maxPingRwTimeout); > pingRwServer(); > } > to = Math.min(to, pingRwTimeout - idlePingRwServer); > } > clientCnxnSocket.doTransport(to, pendingQueue, > outgoingQueue, ClientCnxn.this); > } catch (Throwable e) { > if (closing) { > if (LOG.isDebugEnabled()) { > // closing so this is expected > LOG.debug("An exception was thrown while closing > send thread for session 0x" > + Long.toHexString(getSessionId()) > + " : " + e.getMessage()); > } > break; > } else { > // this is ugly, you have a better way speak up > if (e instanceof SessionExpiredException) { > LOG.info(e.getMessage() + ", closing socket > connection"); > } else if (e instanceof SessionTimeoutException) { > LOG.info(e.getMessage() + RETRY_CONN_MSG); > } else if (e instanceof EndOfStreamException) { > LOG.info(e.getMessage() + RETRY_CONN_MSG); > } else if (e instanceof RWServerFoundException) { > LOG.info(e.getMessage()); > } else { > LOG.warn( > "Session 0x" > + Long.toHexString(getSessionId()) > + " for server " > + > clientCnxnSocket.getRemoteSocketAddress() > + ", unexpected error" > + RETRY_CONN_MSG, e); > } > cleanup(); > if (state.isAlive()) { > eventThread.queueEvent(new WatchedEvent( > Event.EventType.None, > Event.KeeperState.Disconnected, > null)); > } > clientCnxnSocket.updateNow(); > clientCnxnSocket.updateLastSendAndHeard(); > } > } > } > cleanup(); > clientCnxnSocket.close(); > if (state.isAlive()) { > eventThread.queueEvent(new WatchedEvent(Event.EventType.None, > Event.KeeperState.Disconnected, null)); > } > ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(), > "SendThread exitedloop.");//at this > line, error occurs. > } > -------------------------------------------------------------------------------------------------------------- > > Regards, > Bob > > > > > >