这是我的用例…我有一个上游服务,通过网络发送我的Netty应用程序数据,并且该数据需要发布到连接到Netty的多个客户端.推送到客户端的数据必须是HTTP“Transfer-Encoding:chunked”.
我找到了ChunkedStream,虽然也许我可以创建一个PipedInputStream和一个PipedOutputStream(连接到PipedInputStream)并将ChunkedStream写入通道.然后,当从我的上游服务收到数据时,我可以将数据写入通道的PipedOutputStream,然后将其发送给客户端:
在channelConnected中
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
ctx.getChannel().write( new PersistentChunkedStream(in) );
单独的线程将数据发布到连接的通道
ChannelBuffer buff = ChannelBuffers.copiedBuffer("FOO",CharsetUtil.UTF_8);
out.write( buff.array() );
channel.get(ChunkedWriteHandler.class).resumeTransfer();
如果有0个字节可用,我必须扩展ChunkedStream以从nextChunk返回null(在没有线程挂起的情况下“挂起”写入),所以在写入相关通道的PipedOutputStream之后我调用resumeTransfer.当我调试并逐步执行代码时,我可以看到正在调用ChunkedWriteHandler的flush,它会调用:
Channels.write(ctx, writeFuture, chunk, currentEvent.getRemoteAddress());
我写入PipedOutputStream的字节数,但它从未被客户端接收过.
HTTP卷曲
~ $curl -vN http://localhost:8080/stream
* About to connect() to localhost port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /stream HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
<
### NOTE: NO "FOO" TRANSMIT BACK ###
有什么想法吗?也许有更好的方法来实现这一目标?
解决方法:
我想知道为什么你甚至想要使用PipedInputStream / PipedOutputStream.我认为没有你的数据直接调用Channel.write(..)会更干净/更容易.请注意在Channel.write(..)中提交尽可能多的数据,因为它是一项昂贵的操作.
您可以从任何您想要的线程调用Channel.write(..)作为其线程安全.
标签:java,netty
来源: https://codeday.me/bug/20190723/1513967.html