我有一个Undertow服务器并运行默认值。 我试图发送一个chunked请求,当服务器接收块时,输入流服务器端永远不会达到-1状态并挂起。
我使用了Undertow服务器的默认值(我曾尝试增加线程数但仍然没有运气)。
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello World");
}
})
.setHandler(Handlers.routing().post("/xml", blockingHandler))
.build();
server.start();
起初我试图使用普通的httpHandler,但是却犯了错误。
java.lang.IllegalStateException: UT000035: Cannot get stream as startBlocking has not been invoked
经过一番研究后,我在stackoverflow上找到了以下建议的BlockingHandler。我不再收到上面的错误,但现在处理程序挂起了。
以下是处理程序的代码(为了清楚起见,我已删除了异常处理):
HttpHandler httpHandler = new HttpHandler() {
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
StringBuilder builder = new StringBuilder( );
try(InputStream inputStream = exchange.getInputStream()){
int line;
while( ( line = inputStream.read() ) != -1 ) {
builder.append( line );
System.out.print((char)line);
}
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Chunks Posted");
} }
我使用邮递员发送请求如下:
POST /xml HTTP/1.1
Host: localhost:8080
Transfer-Encoding: chunked
Cache-Control: no-cache
Postman-Token: c67e61c0-ce64-4490-9add-f8c37b128fe4
5<CR><LF>
aaaaa<CR><LF>
5<CR><LF>
bbbbb<CR><LF>
0<CR><LF><CR><LF>
当请求与上面的主体一起发送时,数据被正确读取但看起来inputStream没有关闭,导致挂起。如果我没有使用chunked标头发送,那么流的行为与预期的一样。
我能找到的最接近的问题是:https://issues.jboss.org/browse/WFLY-6671
但无法复制,门票已关闭。 我试图增加worker io线程的数量,因为underow文档声明它默认为1,这可能会导致挂起其他连接,但仍然没有运气。
我是Undertow和chunking的新手,但基本上我想要创建的是一个服务器,它可以处理大量的XML请求,这些XML请求以块的形式接收并输出到管道,也许是Kafka或像Mongo这样的数据库。 / p>
任何帮助都会很棒,因为我无法理解为什么它会挂起并且不了解底层封装流。我认为也许0读入可能意味着流的结束而不是通常的-1,但从我可以看到的情况并非如此。
更新:如果我尝试通过带有-H“Transfer-Encoding:chunked”标志的cURL发送请求,则没有挂起,但是正在读取''标签。尝试转义字符以及删除它们,但表示块结束的0正被读取为字符。