2012-12-10 4 views
0

현재 Netty로 압축을 구현하려고합니다. 이 문제를 해결하기 위해 PortUnification 예제를 사용하고 있습니다. 그러나 LengthFieldPrepender는 항상 ZlibEncoder보다 먼저 호출됩니다.ZlibEncoder 전에 LengthFieldPrepender를 호출했습니다.

public class PortUnificationServerHandler extends FrameDecoder 
{ 

    private final boolean detectSsl; 
    private final boolean detectGzip; 
    private AppConfiguration appConfiguration; 
    private final ExecutionHandler executionHandler; 

public PortUnificationServerHandler(AppConfiguration pAppConfiguration, ExecutionHandler pExecutionHandler) 
{ 
    appConfiguration = pAppConfiguration; 
    this.executionHandler = pExecutionHandler; 
    detectGzip = false; 
    detectSsl = false; 
} 

@Override 
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception 
{ 

    String lRequest = buffer.toString(CharsetUtil.UTF_8); 
    if (ConnectionServiceHelper.isValidJSON(lRequest)) 
    { 
     ObjectMapper lObjectMapper = new ObjectMapper(); 
     StringReader lStringReader = new StringReader(lRequest); 
     JsonNode lNode = lObjectMapper.readTree(lStringReader); 
     if (lNode.get(Constants.REQUEST_TYPE).asText().trim().equalsIgnoreCase(Constants.LOGIN_REQUEST)) 
     { 
      JsonNode lDataNode1 = lNode.get(Constants.REQUEST_DATA); 
      LoginRequest lLogin = lObjectMapper.treeToValue(lDataNode1, LoginRequest.class); 

      if (lLogin.getCompress() != null) 
      { 
       if (lLogin.getCompress().trim().equalsIgnoreCase(Constants.COMPRESS_FLAG_TRUE)) 
       { 
        enableJSON(ctx); 
        enableGzip(ctx); 
        ctx.getPipeline().remove(this); 
       } 
       else 
       { 
        enableJSON(ctx); 
        ctx.getPipeline().remove(this); 
       } 
      } 
      else 
      { 
       enableJSON(ctx); 
       ctx.getPipeline().remove(this); 

      } 
      for (String lName : ctx.getPipeline().getNames()) 
      { 
       System.out.println("Handler Name " + lName); 
      } 
     } 
    } 

    // Forward the current read buffer as is to the new handlers. 
    return buffer.readBytes(buffer.readableBytes()); 
} 



private void enableJSON(ChannelHandlerContext ctx) 
{ 
    ChannelPipeline pipeline = ctx.getPipeline(); 

    boolean lHandlerExists = pipeline.getContext("bufferedwriter") != null; 

    if (!lHandlerExists) 
    { 
     pipeline.addFirst("bufferedwriter", new MyBufferedWriteHandler()); // 80960 
    } 

    lHandlerExists = pipeline.getContext("framer") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); // 80960 
    } 

    lHandlerExists = pipeline.getContext("decoder") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8)); 
    } 

    lHandlerExists = pipeline.getContext("encoder") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8)); 
    } 

    lHandlerExists = pipeline.getContext("executor") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("executor", executionHandler); 
    } 

    lHandlerExists = pipeline.getContext("handler") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("handler", new ConnectionServiceUpStreamHandler(appConfiguration)); 
    } 

    lHandlerExists = pipeline.getContext("unite") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addLast("unite", new PortUnificationServerHandler(appConfiguration, executionHandler)); 
    } 
} 

private void enableGzip(ChannelHandlerContext ctx) 
{ 
    ChannelPipeline pipeline = ctx.getPipeline(); 

    boolean lHandlerExists = pipeline.getContext("encoder") != null; 
    if (lHandlerExists) 
    { 
     pipeline.remove("encoder"); 
    } 


    lHandlerExists = pipeline.getContext("gzipdeflater") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addBefore("executor", "gzipdeflater", new ZlibEncoder(ZlibWrapper.GZIP)); 
    } 


    lHandlerExists = pipeline.getContext("lengthprepender") != null; 
    if (!lHandlerExists) 
    { 
     pipeline.addAfter("gzipdeflater", "lengthprepender", new LengthFieldPrepender(4)); 
    } 


    } 
} 

내가 잘못 가고있는 부분에 대한 조언이 있으십니까? 우분투 12.4에서 jdk 1.7과 함께 netty 3.5.11을 사용하고 있습니다.

감사합니다.

답변

0

왜 이런 일이 발생했는지 파악하지 못했습니다. 해결 방법을 구축하기 위해 관리되었습니다. ZlibEncoder를 확장하는 커스텀 핸들러를 구축하고 super.encode를 호출 한 직후에 길이를 prepending하는 코드를 넣었습니다.

위대한 프레임 워크 !!

건배.

관련 문제