我正在尝试在泽西岛设置Vert.X来处理POST数据(不一定是表单数据)。
泽西岛的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没有被调用,并且正在等待它。
发布于 2017-09-20 21:17:29
有两个组件是必需的。
vertx.executeBlocking阻止的处理分离(请参阅https://github.com/trajano/app-ms/blob/7f1de326683473839ffe85fe711cbe719f7a0a74/ms-engine/src/main/java/net/trajano/ms/engine/JaxRsRoute.java#L128 )。发布于 2017-09-20 20:35:04
如此美丽的问题需要解决:)
您可以在https://github.com/jersey/jersey/blob/12e5d8bdf22bcd2676a1032ed69473cf2bbc48c7/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/JerseyHttp2ServerHandler.java#L124获得灵感,在那里可以实现泽西与Netty的集成。
我认为解决的问题完全相同(虽然对于不同的for服务器,本例中的Netty ),即:
ApplicationHandler.handle()方法。InputStream。这是在NettyInputStream实现的。它利用了这样一个事实,即Netty的ByteBuf可以很容易地转换为InputStream,因此通过使用LinkedBlockingDeque,可以将这些InputStreams转换为单个InputStreams。(只是fyi,我不能100%确定提供者(事件循环线程)是否被保护为永不阻塞,这将是一个错误。)顺便说一句,这只是对传入数据的处理。对于响应,您必须实现OutputStream (由泽西岛使用)到Vert.X非阻塞API的转换。
https://stackoverflow.com/questions/46325730
复制相似问题