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
> 
>  
>  
>  
>  
>                                         

                                          

Reply via email to