2017-10-04 1 views
0

Tomcat 7 웹 응용 프로그램에 hazelcast (3.8.2)를 내장했습니다. 시스템 종료시 전화가 걸려왔다.포함 된 hazelcast는 Tomcat의 완전 종료를 막습니다.

myInstance.shutdown(); 
Hazelcast.shutdownAll(); 

그러나 나는 여전히 내 webapp의 셧다운을 방해하는 톰캣 로그에이 오류가 발생한다. HazelcastManagedThread은 서버가 중지 된 후 ClisterListenerSupport 인스턴스를 실행하려고 시도하는 것 같습니다.

시스템 종료 후크에 추가해야하는 정리 단계가 누락 되었습니까?

04-Oct-2017 12:15:08.923 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8084"] 
04-Oct-2017 12:15:08.952 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"] 
04-Oct-2017 12:15:09.048 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8084"] 
04-Oct-2017 12:15:09.049 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"] 
04-Oct-2017 12:15:14.226 INFO [hz.client_0.cluster-] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. 
    java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. 
     at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1327) 
     at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1313) 
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1196) 
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) 
     at com.hazelcast.client.spi.impl.ClusterListenerSupport$1.run(ClusterListenerSupport.java:235) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
     at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64) 
     at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80) 

    Exception in thread "hz.client_0.cluster-" java.lang.IllegalStateException: Can't overwrite cause with java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. 
     at java.lang.Throwable.initCause(Throwable.java:457) 
     at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1316) 
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1196) 
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) 
     at com.hazelcast.client.spi.impl.ClusterListenerSupport$1.run(ClusterListenerSupport.java:235) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
     at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64) 
     at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80) 
    Caused by: java.lang.ClassNotFoundException 
     at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1315) 
     ... 8 more 

답변

0

수정하기가 어렵습니다. 문제는 Tomcat이 이미 셧다운 모드에 있으며 클래스 로더가 새로운 클래스를로드하지 않는다는 것입니다. 그러나 Hazelcast는 처음 종료시 클래스를 사용하므로로드해야합니다. 이 문제를 해결하는 것은 사실 꽤 추한 것입니다. Class.forName (또는 다른 반사 메커니즘)을 사용하여 클래스를로드 할 수 있습니다. 클래스에 대한 참조를 저장할 필요는 없지만 실제로 JVM이이 다른 클래스에 따라 클래스를로드하도록합니다.

+0

왜 Hazelcast가 종료 후에 이것을 수행하려고하는 이유가 있습니까? 이것은 시작이나 종료시에 내가 잘못하고있는 것처럼 들립니다. – Kevin

+0

이전에 사용 된 적이없는 시스템 종료 중에 클래스가 사용 되었기 때문에 간단합니다. – noctarius

관련 문제