2017-05-12 8 views
0

간단한 Netty 테스트 서버를 사용하여 mongo 데이터베이스를 쿼리하고 결과를 반환하고 싶습니다. 여기에 Netty 저장소의 간단한 hello world 튜토리얼을 설정했습니다 : https://github.com/netty/netty/tree/4.0/example/src/main/java/io/netty/example/http/helloworldNetty와 MongoDB 비동기 콜백이 함께 작동하지 않습니다.

예제와 같이 "hello world"문자열을 반환하는 비동기 MongoDB 호출을 추가하기 위해 간단한 튜토리얼을 수정했습니다. 수정은 HTTP 호출이 완료되지 않습니다.

원본 방법 : 계정 변경 후

public void channelRead(ChannelHandlerContext ctx, Object msg) { 
    if (msg instanceof HttpRequest) { 
     HttpRequest req = (HttpRequest) msg; 

     boolean keepAlive = HttpHeaders.isKeepAlive(req); 
     FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(CONTENT)); 
     response.headers().set(CONTENT_TYPE, "text/plain"); 
     response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); 

     if (!keepAlive) { 
      ctx.write(response).addListener(ChannelFutureListener.CLOSE); 
     } else { 
      response.headers().set(CONNECTION, Values.KEEP_ALIVE); 
      ctx.write(response); 
     } 
    } 
} 

:

private final MongoCollection<Document> collection = ... 

public void channelRead(final ChannelHandlerContext ctx, Object msg) { 
    if (msg instanceof HttpRequest) { 
     final HttpRequest req = (HttpRequest) msg; 

     collection.find(Filters.eq("_id", new ObjectId("..."))).first(new SingleResultCallback<Document>() { 

      public void onResult(Document document, Throwable throwable) { 
       boolean keepAlive = HttpUtil.isKeepAlive(req); 
       FullHttpResponse response = ... 
       (SAME CODE AS ABOVE) 
     }); 
    } 
} 

내가 내 코드를 때리고, 그러나 응답이 클라이언트로 전송 결코 극복 볼 수 있습니다. ServerHandler 메소드에서 비동기 호출을 작성하려면 어떻게해야합니까?

답변

3

콘텐츠를 실제로 소켓에 플러시하려면 flush()으로 전화하거나 write(...)writeAndFlush(...)으로 변경해야합니다.