2013-02-18 25 views
0

以前,我們使用Netty 4.0.0.Alpha7來開發我們的Websocket應用程序,並且一切正常。一旦Netty 4.0.0.Beta1發佈,我們將它們整合到我們的應用程序中。但是,沒有客戶端可以連接到應用程序。最初,我認爲這是我們的問題,所以我們從github獲得websocket示例,但它也不起作用。Netty Beta1上的怪異行爲

奇怪的是我們的應用程序和示例可以在我們的本地機器上運行時正常工作,但是一旦部署到我們的服務器上,它就不起作用。當我們在同一臺服務器上回滾到Netty Alpha7時,它再次正常工作。有人遇到這種問題嗎?

這裏是我在我們的服務器(Linux)中運行Websocket示例時發現的異常。未發現此異常,當我跑本地機器(Windows7的)

io.netty.channel.ChannelPipelineException: io.netty.buffer.IllegalBufferAccessException 
    at io.netty.channel.DefaultChannelPipeline.notifyHandlerException(DefaultChannelPipeline.java:1019) 
    at io.netty.channel.DefaultChannelHandlerContext.freeHandlerBuffersAfterRemoval(DefaultChannelHandlerContext.java:360) 
    at io.netty.channel.DefaultChannelHandlerContext.invokeInboundBufferUpdated(DefaultChannelHandlerContext.java:962) 
    at io.netty.channel.DefaultChannelHandlerContext.fireInboundBufferUpdated0(DefaultChannelHandlerContext.java:926) 
    at io.netty.channel.DefaultChannelHandlerContext.fireInboundBufferUpdated(DefaultChannelHandlerContext.java:904) 
    at io.netty.channel.DefaultChannelPipeline.fireInboundBufferUpdated(DefaultChannelPipeline.java:909) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:115) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:401) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:365) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:302) 
    at io.netty.channel.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: io.netty.buffer.IllegalBufferAccessException 
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:81) 
    at io.netty.channel.ChannelInboundByteHandlerAdapter.freeInboundBuffer(ChannelInboundByteHandlerAdapter.java:46) 
    at io.netty.channel.DefaultChannelHandlerContext.freeHandlerBuffersAfterRemoval(DefaultChannelHandlerContext.java:358) 
    ... 10 more 
io.netty.channel.ChannelPipelineException: io.netty.buffer.IllegalBufferAccessException 
    at io.netty.channel.DefaultChannelPipeline.notifyHandlerException(DefaultChannelPipeline.java:1019) 
    at io.netty.channel.DefaultChannelHandlerContext.freeHandlerBuffersAfterRemoval(DefaultChannelHandlerContext.java:360) 
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelInactive(DefaultChannelHandlerContext.java:823) 
    at io.netty.channel.DefaultChannelHandlerContext.access$1300(DefaultChannelHandlerContext.java:38) 
    at io.netty.channel.DefaultChannelHandlerContext$5.run(DefaultChannelHandlerContext.java:808) 
    at io.netty.channel.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:259) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:305) 
    at io.netty.channel.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: io.netty.buffer.IllegalBufferAccessException 
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:81) 
    at io.netty.channel.ChannelInboundByteHandlerAdapter.freeInboundBuffer(ChannelInboundByteHandlerAdapter.java:46) 
    at io.netty.channel.DefaultChannelHandlerContext.freeHandlerBuffersAfterRemoval(DefaultChannelHandlerContext.java:358) 
    ... 7 more 

更新上,似乎這是java版的問題。最初,java版本是6u17,應用程序不起作用。在我將其更新至6u38後,該應用程序正常工作。

+0

任何異常? – 2013-02-19 06:35:34

+0

感謝您的回覆。我在服務器上運行示例的內容中添加了異常詳細信息。不幸的是,我們已經回滾使用Alpha7,所以我們現在無法複製這個問題,並且我們昨天沒有保存這個異常。 – Boong 2013-02-19 07:14:56

回答

0

好吧我想你嘗試從ChannelPipeline中刪除ChannelHandler後訪問緩衝區。這是不允許的,因爲Beta1確保我們不會在刪除時泄漏任何內存。如果您想要移除ChannelHandler並將緩衝區中剩餘的內容轉發到ChannelPipeline中的下一個ChannelHandler,請使用ChannelPipeline.removeAndForward(..)。

參見: https://github.com/netty/netty/issues/1054#issuecomment-13760528

+0

嗨, 感謝您的回覆。我不確定這是相同的情況,因爲我使用了https://github.com/netty/netty/tree/master/example/src/main/java/io/netty/example/http/websocketx/server 。 我嘗試分析在本地機器和服務器上運行的差異。當我使用shell腳本在服務器上運行時,我發現如果在shell腳本中設置了CLASSPATH變量,那麼該示例將如上所述拋出異常。另一方面,如果我跳過腳本設置CLASSPATH變量並在java命令中使用-cp,則該示例正常工作。你對這個案子有什麼看法? – Boong 2013-02-19 11:01:56

+0

聽起來很奇怪......我想不出爲什麼CLASSPATH會影響到這一點。也許你有一些混合版本? – 2013-02-19 11:29:50

+0

很抱歉給你誤導性的信息。我終於發現它可能是我在服務器上使用的java版本的問題。服務器最初運行在java 6u17上,並且該示例不起作用。一旦我設置系統路徑來運行Java 6u38,它工作正常。這可能是java版本問題。感謝您的幫助。 – Boong 2013-02-19 12:44:48