【问题标题】:Weird behavior on Netty Beta1Netty Beta1 上的奇怪行为
【发布时间】:2013-02-18 11:03:43
【问题描述】:

之前,我们使用 Netty 4.0.0.Alpha7 开发我们的 Websocket 应用程序,一切正常。 Netty 4.0.0.Beta1 发布后,我们将它们合并到我们的应用程序中。但是,没有客户端可以连接到应用程序。最初,我认为这是我们的问题,所以我们从 github 获取了 websocket 示例,但它也不起作用。

奇怪的是,当我们在本地机器上运行时,我们的应用程序和示例可以正常工作,但是一旦部署到我们的服务器上,它就不能工作了。当我们在同一台服务器上回滚到 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 后,应用程序运行良好。

【问题讨论】:

  • 感谢您的回复。我在我们的服务器中运行示例的内容中添加了异常详细信息。不幸的是,我们已经回滚以使用 Alpha7,因此我们现在无法重现该问题,而且我们昨天也没有保存异常。

标签: netty


【解决方案1】:

好的,我猜您在从 ChannelPipeline 中删除 ChannelHandler 后尝试访问缓冲区。这是不允许的,因为 Beta1 以确保我们在删除时不会泄漏任何内存。如果要删除 ChannelHandler 并将缓冲区中的剩余内容转发到 ChannelPipeline 中的下一个 ChannelHandler 使用 ChannelPipeline.removeAndForward(..) 。

另请参阅: https://github.com/netty/netty/issues/1054#issuecomment-13760528

【讨论】:

  • 您好,感谢您的回复。我不确定这是否相同,因为我使用了github.com/netty/netty/tree/master/example/src/main/java/io/… 的示例。我尝试分析在本地机器和服务器上运行之间的差异。当我使用 shell 脚本在服务器中运行时,我发现如果我在 shell 脚本中设置 CLASSPATH 变量,该示例将抛出上述异常。另一方面,如果我跳过脚本设置 CLASSPATH 变量并在 java 命令中使用 -cp,则该示例可以正常工作。你怎么看这个案子?
  • 听起来很奇怪......我想不出任何好的理由为什么 CLASSPATH 会影响这一点。也许你有一些混合版本?
  • 很抱歉给您带来误导性信息。我终于发现这可能是我在服务器上使用的java版本的问题。该服务器最初运行在 java 6u17 上,示例不起作用。一旦我设置系统路径来运行 java 6u38,它就可以正常工作。可能是java版本问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2020-12-26
  • 2013-04-20
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多