POST 데이터 (반드시 폼 데이터는 아님)를 처리하기 위해 Jersey로 Vert.X를 설정하려고합니다.Vert.x ReadStream <Buffer> to 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()'메서드는이 다른 스레드에 의해 호출되며 모든 것이 완벽하게 작동합니다. Jersey가 non-blocking API를 가지고 있지 않으면 (불행하게도 그것은 가까운 것이었다.) –
가장 가까운 것이 맞습니다. (방금 작동했습니다.) –