我想用Jersey设置Vert.X来处理POST数据(不一定是表单数据)。Vert.x ReadStream <Buffer>到InputStream
泽西岛ContainerRequest.setEntityStream
需要在InputStream
这是我正在试图建立。不过,我似乎无法避开传递数据,而无需使用bodyHandler
或有类似的功能,但限制了输入
final Buffer body = Buffer.buffer();
event
.handler(buffer -> {
if (!event.response().headWritten()) {
body.appendBuffer(buffer);
if (body.length() > 10 * 1024 * 1024) {
event.response()
.setStatusCode(REQUEST_ENTITY_TOO_LARGE.getStatusCode())
.setStatusMessage(REQUEST_ENTITY_TOO_LARGE.getReasonPhrase())
.end();
}
}
})
.endHandler(aVoid -> {
request.setEntityStream(new VertxBufferInputStream(body));
appHandler.handle(request);
});
VertxBufferInputStream
自己的自定义方法读取整个事情到内存是一个简单的包装到VertXbuffer 。通过避免转换为ByteArrayInputStream()来节省一些内存。但它具有整个身体。
我想避免让整个身体流动。我已经尝试了一些非常不好用的代码,最终无法正常工作,因为它阻止了事件循环,因为handler
未被调用并正在等待它。
谢谢我也研究过它。我的一次尝试与此类似,但仍然阻塞,因为“take()”会阻止。 –
我不明白。这很完美。 'take()'是阻塞的(这是'InputStream.read()'的合约)。重要的部分是我在[1]中描述的,'ApplicationHandler.handle()'必须委托给不同的线程。结果,这个'take()'方法被另一个线程调用,并且一切正常。除非泽西带来了非阻塞API,否则没有其他办法可以实现(不幸的是,它很接近)。 –
正确它是最接近的一个。 (我刚刚得到它的工作) –