在这种情况下,我编写了一个演示,该演示将同时向我的服务器发送两个不同的请求。
通常: Undertow将使用两个XNIO工作线程
[ XNIO-1 I/O-3 XNIO-1 I/O-4]
处理这两个请求:
2018-11-30 12:42:10.408 INFO 13052 --- [ XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler : ======收到Up请求, id=18179c3d-8958-4ca2-b5a1-65d0f73991da, ak=8c3d8bde3d94397e539dd6eff6e0318336db8e30=======
2018-11-30 12:42:11.896 INFO 13052 --- [ XNIO-1 I/O-4] com.ecarx.asrapi.handler.ASRHandler : ======收到Down请求, id=18179c3d-8958-4ca2-b5a1-65d0f73991da, ak=8c3d8bde3d94397e539dd6eff6e0318336db8e30=======
异常: Undertow使用相同的IO工作线程
[ XNIO-1 I/O-3]
处理我的不同请求:
2018-11-30 12:42:24.253 INFO 13052 --- [ XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler : ======收到Up请求, id=4b16a94a-7cc0-4904-ae2b-aae63093ed25, ak=91349ab08e093314705cb59872a206f25f3502bb=======
2018-11-30 12:42:25.737 INFO 13052 --- [ XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler : ======收到Down请求, id=4b16a94a-7cc0-4904-ae2b-aae63093ed25, ak=91349ab08e093314705cb59872a206f25f3502bb=======
演示:可能会发送两个不同的请求:
String url = config.getUrl();
executor.execute(() -> handleUpStream(url + "/up?id=" + id + "&ak=" + token, type, data));
//handle down stream
executor.execute(() -> handleDownStream(url + "/down?id=" + id + "&ak=" + token, responses));
汉德尔:
@PostMapping(value = "up", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Mono<Object> handleASRUp(@RequestParam(required = false) String id, @RequestParam String ak, ServerHttpRequest request) {// need more time to handle...}
@PostMapping(value = "down", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Mono<Void> handleASRDown(@RequestParam String id, @RequestParam String ak, ServerHttpResponse response) {//need a little time to handle...}
答案 0 :(得分:0)
现在我想可能是NIO编号问题,因为我将server.undertow.io-threads设置为1,服务器将始终使用一个NIO线程同时处理我的“ up”和“ down”请求,挂断“上”请求并处理“下”请求。 但是我不明白为什么服务器不阻止外部的“ Down”请求,在“ up”请求完成之后,才开始处理“ down”请求;毕竟,“到达要求”是首先到达的。