NPE в канале.write(объектное сообщение)

Я использую (самостоятельное) промежуточное программное обеспечение «Service Connector (SC)», основанное на netty (3.2.5.Final.jar), которое в основном является прокси для http-трафика. Любой входящий запрос перенаправляется на удаленный узел, в конце — на апач.

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

Отправляю запрос через браузер в СЦ например: "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);

Думаю, я столкнулся с состоянием гонки. это происходит только на медленных машинах, конечно, это трудно воспроизвести, не для. я не могу привести пример.

Я пробовал netty 3.5.10.Final с таким же поведением. кто-нибудь наблюдает подобное поведение? спасибо!


person schoeggii    schedule 30.11.2012    source источник
comment
Пожалуйста, покажите мне ваш полный обработчик..   -  person Norman Maurer    schedule 30.11.2012
comment
обязательно: stabilit.ch/download/sc/   -  person schoeggii    schedule 30.11.2012


Ответы (1)


outboundChannel может быть только null, если messageReceived вызывается до channelOpen. Обычно этого никогда не происходит, но это может произойти, если ваш конвейер имеет ExecutionHandler перед вашим обработчиком, и вы используете неупорядоченный сервис-исполнитель. Если да, используйте ExecutorService, например OrderedMemoryAwareThreadPoolExecutor.

person trustin    schedule 03.12.2012
comment
Большое спасибо и извините, очевидно, я недостаточно внимательно прочитал ExecutionHandler API :/! - person schoeggii; 03.12.2012