我很难理解如何在Netty 4中使用Chunks。
我要做的是以某种方式替换一个servlet,保持连接打开并每秒发送两次数据。
所以,我查看了servlet返回的头文件,现在有一个扩展ChannelInboundMessageHandlerAdapter<FullHttpRequest>
的Netty处理程序。
我实际上在我的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
。
现在,如果我做对了,我现在应该在我的频道中写ChunkedInput
以发送件数据。
我创建了一个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的块,因为我的套接字输出中没有任何内容...
答案 0 :(得分:0)
实际上,我遇到的这个问题是因为我发送了一个HTTP OK响应,而不是101-CONTINUE。
现在似乎工作正常。