问题描述
completed
当读取数据块时,从java管理的线程异步调用该方法。要重用CompletionHandler:
// More data to read
ch.read(buffer, null, this); //here you pass the same CompletionHandler you are using
Java专家建议,当您完成读取操作(该else
块)时,应使用另一个线程上下文。
这是为了避免在a内部阻塞和长期运行的文档CompletionHandler
,请参见第33页http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf
解决方法
我正在使用Java
7和AsynchronousSocketChannel
。我想读取一个请求(例如HTTP
POST
),但如果它大于ByteBuffer
我正在使用的大小,则我正在努力想出一个很好的解决方案来读取完整的请求。例如,如果ByteBuffer
是4048字节,并且HTTP
POST包含大于4kB的图像。
有没有很好的递归解决方案或循环呢?
这是我的阅读请求代码:
public void readRequest(final AsynchronousSocketChannel ch) {
final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
final StringBuilder strBuilder = new StringBuilder();
final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();
ch.read(buffer,null,new CompletionHandler<Integer,Void>() {
public void completed(Integer bytes,Void att) {
buffer.flip();
try {
decoder.reset();
strBuilder.append(decoder.decode(buffer).toString());
} catch (CharacterCodingException e) {
e.printStackTrace();
}
buffer.clear();
// More data to read or send response
if(bytes != -1) {
// More data to read
ch.read(...);
} else {
// Create and send a response
}
}
public void failed(Throwable exc,Void att) {
exc.printStackTrace();
}
});
}
在我写过的地方:
// More data to read
ch.read(...);
它看起来像是代码重用的好地方,但是我无法提出一个好的解决方案。有什么办法可以在这里重用CompletionHandler吗?有什么建议阅读有限的完整请求ByteBuffer
吗?
我想以一种非阻塞和异步的方式解决这个问题。