0

以前は、Netty 4.0.0.Alpha7を使用してWebsocketアプリケーションを開発しましたが、すべて正常に機能します。Netty 4.0.0.Beta1がリリースされたら、それらをアプリケーションに組み込みます。ただし、クライアントはアプリケーションに接続できません。最初は、それが私たちの問題だと思ったので、githubからwebsocketの例を取得しましたが、それも機能しません。

奇妙なことに、アプリケーションと例はローカルマシンで実行すると正常に機能しますが、サーバーにデプロイすると機能しません。同じサーバーでNettyAlpha7にロールバックすると、再び正常に動作します。誰かがこの種の問題を経験しますか?

これは、サーバー(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に更新すると、アプリケーションは正常に動作します。

4

1 に答える 1

0

ChannelPipeline から ChannelHandler を削除した後、バッファにアクセスしようとしていると思います。Beta1 では削除時にメモリ リークが発生しないようにしているため、これは許可されていません。ChannelHandler を削除し、バッファ内の残りのものを ChannelPipeline の次の ChannelHandler に転送する場合は、 ChannelPipeline.removeAndForward(..) を使用します。

参照: https://github.com/netty/netty/issues/1054#issuecomment-13760528

于 2013-02-19T09:28:53.487 に答える