2012-08-06 31 views
1
HttpMessageDecoder.skipControlCharacters

我想讀Netty的HTTP請求時得到奇怪的錯誤:上的NullPointerException Netty中

java.lang.NullPointerException 
at 
org.jboss.netty.handler.codec.http.HttpMessageDecoder.skipControlCharacters(HttpMessageDecoder.java:409) 
at org.jboss.netty.handler.codec.http.HttpMessageDecoder.decode(HttpMessageDecoder.java:184) 
at org.jboss.netty.handler.codec.http.HttpMessageDecoder.decode(HttpMessageDecoder.java:107) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:470) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:443) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261) 
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:351) 
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282) 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:679) 

堆棧跟蹤不會在我的代碼結束了,我不知道如何調試呢?

class RouteHandler(default: Tuple2[String, Int]) extends SimpleChannelUpstreamHandler { 

    override def handleUpstream(ctx: ChannelHandlerContext, e: ChannelEvent) { 
    e match { 
     case evt: UpstreamMessageEvent => 
     evt.getMessage match { 
      case req: HttpRequest => { 
      val projectHdr = req.getHeader("HDR") 
      RouteHandler.log.info("Project ID: {}", projectHdr) 
      val backendServerUri = projectHdr match { 
       case null => default 
       case uri: String => 
       if (ObjectId.isValid(projectHdr)) { 
        val serverData = MappingService.resolveServer(new ObjectId(projectHdr)) 
        (serverData.host(), serverData.port()) 
       } 
       else 
        default 
      } 
      RouteHandler.log.info("Route to {}", backendServerUri) 
      val pipeline = ctx.getPipeline 
      pipeline.synchronized { 
       val handler = new ForwardRequestHandler(backendServerUri._1, backendServerUri._2) 
       pipeline.get(HANDLER_NAME) match { 
       case null => pipeline.addLast(HANDLER_NAME, handler) 
       case _ => pipeline.replace(HANDLER_NAME, HANDLER_NAME, handler) 
       } 
      } 
      } 
      case z => RouteHandler.log.warn("Can not handle {}", z.getClass) 
     } 
     case z: DefaultExceptionEvent => RouteHandler.log.error("Exception from Netty", z.getCause) 
     case z => 
    } 
    super.handleUpstream(ctx, e) 
    } 

    override def exceptionCaught(ctx: ChannelHandlerContext, e: ExceptionEvent) { 
    RouteHandler.log.error("Caught", e.getCause) 
    e.getChannel.close() 
    } 
} 
+0

貌似錯誤可能由數據引起的客戶端正在發送到服務器。你使用哪個版本的Netty和哪個客戶端? – Veebs 2012-08-06 23:33:36

+0

你也許也可以分享處理程序? – 2012-08-07 06:51:48

+0

@Veebs不,數據是普通的HTTP GET查詢。沒什麼複雜的 – jdevelop 2012-08-07 12:21:29

回答

1

所以,僅僅是爲了記錄...的錯誤是,HttpMessageDecoder是橫跨這是不允許其沒有被標註witht @Sharable通道共享

相關問題