2013-02-18 2 views
0

Раньше мы использовали Netty 4.0.0.Alpha7 для разработки нашего приложения Websocket, и все работает нормально. Как только Netty 4.0.0.Beta1 будет выпущен, мы включим их в наше приложение. Однако ни один клиент не может подключиться к приложению. Первоначально я думал, что это наша проблема, поэтому мы получаем пример websocket от github, и он тоже не работает.Странное поведение на Netty Beta1

Странно, что наше приложение и пример могут работать нормально, когда мы запускаем нашу локальную машину, но после развертывания на нашем сервере это не сработает. Когда мы возвращаемся к Netty Alpha7 на том же сервере, он снова работает отлично. Кто-нибудь сталкивается с такой проблемой?

Вот исключение, обнаруженное при запуске примера Websocket на нашем сервере (Linux). Это исключение не будет найдено, когда я работал на локальной машине (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 

Update, то кажется, что это проблема Java версии. Первоначально версия java была 6u17, и приложение не работает. После того, как я обновил его до 6u38, приложение работает нормально.

+0

Любые исключения? –

+0

Благодарим за отзыв. Я добавляю детали исключения в контент из запуска примера на нашем сервере. К сожалению, мы вернулись к использованию Alpha7, поэтому мы не можем реплицировать проблему прямо сейчас, и вчера мы не сохранили исключение. – Boong

ответ

0

Хорошо, я думаю, вы пытаетесь получить доступ к буфере после удаления ChannelHandler с ChannelPipeline. Это не допускается с Beta1, чтобы убедиться, что мы не удаляем какую-либо память при удалении. Если вы хотите удалить ChannelHandler и переслать оставшиеся вещи в буфере на следующий ChannelHandler в ChannelPipeline, используйте 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 , Я пытаюсь проанализировать различия между запуском на моей локальной машине и сервером. Когда я запускаю на сервере с помощью сценария оболочки, я обнаруживаю, что если я установлю переменную CLASSPATH в сценарии оболочки, в примере будет выбрано исключение, как указано выше. С другой стороны, если я пропущу переменную CLASSPATH для сценариев и использую -cp в java-команде, этот пример отлично работает. Что вы думаете об этом случае? – Boong

+0

Звучит странно ... Я не могу придумать какой-либо веской причины, почему CLASSPATH повлияет на это. Может быть, у вас есть смешанные версии? –

+0

Извините, что предоставил вам вводящую в заблуждение информацию. Я наконец нашел, что это может быть проблема версии Java, которую я использую на сервере. Сервер первоначально запускается на java 6u17, и пример не работает. Как только я установил системный путь для запуска java 6u38, он работает нормально. Это могут быть проблемы с версией java. Спасибо за помощь. – Boong

Смежные вопросы