2012-11-30 89 views
1

我正在运行基于netty(3.2.5.Final.jar)(基本上是http流量代理)的(自制)中间件“服务连接器(SC)”。任何传入的请求都会转发到远程节点,最后是apache。NPE in channel.write(Object message)

public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throws Exception { 
     ChannelBuffer msg = (ChannelBuffer) event.getMessage(); 
     outboundChannel.write(msg); 
} 

我送过浏览器到SC的请求。例如: “HTTP://本地主机:9104/testHtml.htm”

它通常工作完美!偶尔浏览器会永久循环。不同的模式(不同的文件,大小,时间)

展望网状日志:

2012-11-28 17:54:12.326+0100 [New I/O server boss #9 ([id: 0x015bdc50, /10.43.18.160:9104])] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] OPEN 
2012-11-28 17:54:12.342+0100 [New I/O server boss #9 ([id: 0x015bdc50, /10.43.18.160:9104])] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] BOUND: /10.43.18.160:9104 
2012-11-28 17:54:12.357+0100 [New I/O server boss #9 ([id: 0x015bdc50, /10.43.18.160:9104])] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] CONNECTED: /10.43.18.160:52499 
2012-11-28 17:54:12.342+0100 [SC_WORKER thread-13] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] CHANGE_INTEREST: 0 
2012-11-28 17:54:12.420+0100 [New I/O server worker #9-20] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] RECEIVED: BigEndianHeapChannelBuffer(ridx=0, widx=501, cap=501) - (HEXDUMP: ....) 
2012-11-28 17:54:12.435+0100 [SC_WORKER thread-13] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:39) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] INTEREST_CHANGED 
2012-11-28 17:54:12.451+0100 [SC_WORKER thread-11] DEBUG (org.jboss.netty.handler.logging.LoggingHandler:43) - [id: 0x00f6fd54, /10.43.18.160:52499 => /10.43.18.160:9104] EXCEPTION: java.lang.NullPointerException 
java.lang.NullPointerException 
    at org.serviceconnector.net.res.netty.tcp.proxy.NettyTcpProxyResponderRequestHandler.messageReceived(NettyTcpProxyResponderRequestHandler.java:127) 
    at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:69) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 

在调试模式下,我可以看到无论是味精也不outboundChannel为空:/ 如果我改变编写以下有用。

只是在错误

的情况下
try{ 
    outboundChannel.write(msg); 
} catch(Throwable t) { 
    outboundChannel.write(msg); 
} 

再次写邮件或线程

Thread.sleep(200); 
outboundChannel.write(msg); 

猜我面临的竞争条件放缓。它只发生在慢速机器 当然很难重现,不适用。我无法提供一个例子。

我尝试netty 3.5.10.Final具有相同的行为。任何一个观察到类似的行为? thx!

+0

请给我看看你的完整处理程序.. –

+0

确定:http://www.stabilit.ch/download/sc/NettyTcpProxyResponderRequestHandler.java – schoeggii

回答

3

outboundChannel只能是null如果在channelOpen之前调用messageReceived。通常,它不会发生,但如果您的管道在处理程序之前有一个ExecutionHandler,并且您使用无序的执行程序服务,则可能发生此情况。如果是这样,请使用ExecutorService,如OrderedMemoryAwareThreadPoolExecutor

+0

thx很多,很抱歉,显然我没有仔细阅读ExecutionHandler API:/ ! – schoeggii