0

Netty 4 でチャンクを使用する方法を理解するのに苦労しています。

私がやろうとしているのは、接続を開いたままにし、毎秒 2 回データを送信するサーブレットを何らかの方法で置き換えることです。

そのため、サーブレットから返されたヘッダーを調べたところ、Netty ハンドラーが拡張されていますChannelInboundMessageHandlerAdapter<FullHttpRequest>

私は実際に私のmessageReceived(...)方法でこのようなことをしています:

HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
                                                HttpResponseStatus.OK);
// initialize response
HttpHeaders headers = response.headers();
headers.set(HttpHeaders.Names.CONTENT_TYPE, "text/event-stream");
headers.set(HttpHeaders.Names.CACHE_CONTROL,
            "no-cache, no-store, max-age=0, must-revalidate");
headers.set(HttpHeaders.Names.PRAGMA, HttpHeaders.Values.NO_CACHE);
headers.set(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED);
ctx.write(response);

ChunkedWriteHandler上記のハンドラ コードの直前に、パイプラインにa を追加しました。

さて、これが正しければ、データの断片ChunkedInputを送信するためにチャネルに sを書き込むことになっています。

ChunkedInput次のようなサブクラスを作成しました。

private class MyChunk implements ChunkedByteInput {
    private final ChannelHandlerContext ctx;
    private final String json;
    private boolean done = false;

    private HystrixChunk2(ChannelHandlerContext ctx, String json) {
        this.ctx = ctx;
        this.json = json;
    }

    @Override
    public boolean readChunk(ByteBuf buffer) throws Exception {
        buffer.writeBytes("data: ".getBytes())
                .writeBytes(json.getBytes())
                .writeBytes("\n".getBytes());
        done = true;
        LOGGER.info("Wrote chunck");
        return true;
    }

    @Override
    public boolean isEndOfInput() throws Exception {
        return done;
    }

    @Override
    public void close() throws Exception {
        ctx.channel().close();
    }
}

基本的に、私のmessageReceived(..)メソッドでは、そのクラスのインスタンスを書くだけです。

しかし、ソケットの出力に何も書き込まれないため、バグを発見したか、Netty でチャンクを使用する方法を理解していない可能性が高いです...

4

1 に答える 1