本地使用Netty+Elasticsearch測試表單請求查詢數據,無異常。將工程打包上傳至服務器運行,頁面請求後發生異常,連接關閉。
事件:前臺通過Netty請求資源,Netty後臺通過前臺請求的JSON向ES查詢數據,發生異常。
異常狀況:
21:39:46,019 WARN org.elasticsearch.transport.netty:752 - [Jeanne-Marie Beaubier] exception caught on transport layer [[id: 0x8ed9a041, /xx.xx.xx.xxx:37506 => /xx.xx.xx.xx:9300]], closing connection java.lang.IllegalStateException: Message not fully read (response) for requestId [120], handler [org.elasticsearch.action.TransportActionNodeProxy$1@4448469c], error [false]; resetting at org.elasticsearch.transport.netty.MessageChannelHandler.messageReceived(MessageChannelHandler.java:145) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462) at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443) at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
原因:本地Maven配置中引入Elasticsearch 2.1.0依賴以及Netty依賴,工程運行時,Elasticsearch底層會調用netty相關接口,而服務器中的Elasticsearch(2.1.0)在後臺運行,其也會啓動加載netty相關服務。兩者同時存在,導致數據傳輸時出現問題。
解決辦法:工程通過Maven打jar包時,排除Elasticsearch的相關jar包,只將其他依賴jar包打入。在服務器上運行時,通過設置class_path以及cp命令將服務器的ES相關jar包依賴導入,重新運行,即可。
服務器.sh文件的更改配置:
CLASS_PATH=$APP_HOME/ES-NETTY-WEB-0.0.0-beta.jar:/usr/local/elasticsearch/lib/*
JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -cp $CLASS_PATH $APP_MAINCLASS $APP_HOME/config.properties >/dev/null 2>&1 &"