2016-12-02 143 views
2

我正在嘗試使用log4j appender將日誌發送到GrayLog2(log4j2-gelf)。所以我加我的依賴到我的pom.xml配置log4j2.xml來配置我的appender。用maven構建整個事物並將其部署到本地tomcat,並且一切正常。 當我嘗試關閉tomcat時發生問題。如果我不kill -9 PID tomcat的 Tomcat不停止,catalina.out與此結束:Complete stack traceJava Tomcat,底層Netty線程不停止

什麼了我的注意是

java.lang.NoClassDefFoundError: io/netty/util/concurrent/DefaultPromise$1

首先,我認爲我可以有另一種依賴進口網狀那會導致這個例外。但我尋找一些時間,無法找到任何其他netty導入。然後我看到:

Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [io.netty.buffer.PoolArena$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

而這就是我的問題即將到來的地方。 我的理解是,gelf-appender使用Netty作爲與GrayLog服務器異步通信的一種方式。但它本身就是一臺服務器。那麼Tomcat是否有可能在殺死底層Netty之前停止父Servlet?這會導致這個問題? 我試圖找到關於Tomcat關機的方式的一些文檔,但到目前爲止我沒有找到任何東西,比我可以完全錯誤地關於此診斷...

+0

我已經做了一些挖掘,我似乎無法重現與碼頭的問題,所以這看起來像一個tomcat的問題 – MaxouMask

回答

3

它看起來像你有一個ClassLoader問題

Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [io.netty.buffer.PoolArena$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.checkStateForClassLoading(WebappClassLoaderBase.java:1342)

WebappClassLoader停止服務傳入請求加載,當它接收到關閉信號。您需要Netty jar才能訪問WebappClassLoader。將其輸入$CATALINA_HOME/lib(參見Tomcat classloader howto, section Common)。爲了找到合適的罐子,爲你的web應用運行mvn dependency:tree(如果你用maven)

+0

將在嘗試這個星期一,保持你psted,謝謝 – MaxouMask

+0

它確實解決了這個問題。非常感謝! – MaxouMask