0

Netty サーバーを呼び出す Apache HttpComponents クライアントがあります。コードは簡単なテストです。

   ExecutorService threadpool = Executors.newFixedThreadPool(2);
   Async async = Async.newInstance().use(threadpool);


   Request[] requests = new Request[] {
ContentType.APPLICATION_JSON),
            Request.Post("http://localhost:9090/print").bodyString(getJSon(),    ContentType.APPLICATION_JSON)
   };


    Queue<Future<Content>> queue = new LinkedList<Future<Content>>();
    // Execute requests asynchronously
    for (final Request request: requests) {

        Future<Content> future = async.execute(request, new FutureCallback<Content>() {

            public void failed(final Exception ex) {
                logger.info(ex.getMessage() + ": " + request);
            }

            public void completed(final Content content) {
                logger.info("Request completed: " + request);
            }

            public void cancelled() {
                logger.info("Request cancelled: " + request);
            }

        });
        queue.add(future);
    }

    while(!queue.isEmpty()) {
        Future<Content> future = queue.remove();
        try {

            Content c = future.get();
            logger.info( "Response " + c.asString() );
        } catch (ExecutionException ex) {

            logger.info( "ExecutionException [" + getExceptionAsString( ex ) + "]" );
        }
    }

これは Netty サーバーのwriteResponseメソッドです。

private boolean writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) {

    boolean keepAlive = isKeepAlive(request);


    Response respond = new Response();
    ByteBuf bufResponse = Unpooled.copiedBuffer( respond.getJSon(),
                                                 CharsetUtil.UTF_8);
    logger.info( "Response is [" + respond.getJSon() + "]" );

    FullHttpResponse response = new DefaultFullHttpResponse(
            HTTP_1_1, currentObj.getDecoderResult().isSuccess()? OK : BAD_REQUEST,
            Unpooled.copiedBuffer(bufResponse.toString(), CharsetUtil.UTF_8));

    response.headers().set(CONTENT_TYPE, "application/json; charset=UTF-8");

    ctx.writeAndFlush( response );
    return keepAlive;  
}

ロガーへの呼び出しは期待どおりに機能します。私が印刷しているJSONオブジェクトを返しています。

ただし、HttpComponents クライアントのコールバックメソッドは呼び出されません。サーバーがクライアントに戻らないようです。

Netty サーバーは動作しているようですが、クライアントが正常に返らない理由がわかりません。誰でも間違いを見つけるのを手伝ってもらえますか? 私は日食で両方をテストしています。

4

1 に答える 1

0

それ以外の場合は CONTENT_LENGTH ヘッダーを設定する必要があると思います。永続的な接続を使用しているため、クライアントは応答全体をいつ読み取ったかわかりません。何かのようなもの

response.headers().set(CONTENT_LENGTH, response.content().readableBytes());

于 2013-10-30T11:17:26.123 に答える