1

基本的にhttpトラフィックのプロキシであるnetty(3.2.5.Final.jar)に基づいて、(自作の)ミドルウェア「ServiceConnector(SC)」を実行しています。着信リクエストはすべてリモートノードに転送され、最後にapacheに転送されます。

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

たとえば、ブラウザを介してSCにリクエストを送信しています:「http:// localhost: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) 

デバッグモードでは、msgまたはoutboundChannelのいずれかがnullであることがわかります:/次のコードに変更すると機能します。

エラーが発生した場合は、メッセージをもう一度書いてください

try{
  outboundChannel.write(msg);
} catch(Throwable t) {
  outboundChannel.write(msg);
}

またはスレッドを遅くします

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

私は競合状態に直面していると思います。もちろん、それは遅いマシンでのみ発生し、再現するのは困難です。私は例を提供することができません。

同じ動作でnetty3.5.10.Finalを試しました。同様の行動を観察している人はいますか?どうも!

4

1 に答える 1

3

outboundChannelの前にが呼び出されたnull場合にのみ可能です。通常、これは発生しませんが、パイプラインにハンドラーの前があり、順序付けされていないエグゼキューターサービスを使用している場合に発生する可能性があります。その場合は、などを使用してください。messageReceivedchannelOpenExecutionHandlerExecutorServiceOrderedMemoryAwareThreadPoolExecutor

于 2012-12-03T05:39:48.273 に答える