ฉันเพิ่งสร้าง RestController ในแอปพลิเคชัน springboot(1.5.4.RELEASE) และทดสอบว่ามันทำงานอย่างไรเมื่อมีคำขอหลายรายการเข้ามา สิ่งที่ฉันสับสนคือ:
- URL เดียวกัน : คำขอที่ 2 ถูกบล็อกจนกว่าคำขอที่ 1 จะดำเนินการ
- URL ที่แตกต่างกัน: ไม่บล็อก มีการดำเนินการคำขอ 2 รายการเกือบพร้อมกัน
คำถามของฉันคือใครบล็อกคำขอที่ 2 และเพราะเหตุใด
รหัสทดสอบ:
@GetMapping(value = "/sleep")
public String sleep(HttpServletRequest request, @RequestParam boolean status)
{
String requestId = request.toString();
logger.info("request [{}] in and status = {}.", requestId, status);
String result;
if (status)
{
Thread.currentThread().sleep(10 * 1000);
result = "slept";
}
else
{
result = "stay up";
}
logger.info("response [{}] out and result = [{}].", requestId, result);
return result;
}
ผลการทดสอบ:
- URL อื่น:อย่าบล็อก เกือบจะเริ่มดำเนินการพร้อมกัน
http://localhost:20002/sleep?status=false และ http://localhost:20002/sleep?status=true
2018-08-14 15:04:14.139 [http-nio-20002-exec-5]: connection [RequestFacade@46515328] in and status = true.
2018-08-14 15:04:16.452 [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] in and status = false.
2018-08-14 15:04:16.452 [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] out and result = [stay up].
2018-08-14 15:04:24.139 [http-nio-20002-exec-5]: connection [RequestFacade@46515328] out and result = [slept].
- URL เดียวกัน: บล็อก คำขอที่ 2 จะไม่ดำเนินการจนกว่าคำขอที่ 1 จะเสร็จสิ้น
http://localhost:20002/sleep?status=true และ http://localhost:20002/sleep?status=true
2018-08-14 15:10:29.943 [http-nio-20002-exec-9]: connection [RequestFacade@46515328] in and status = true.
2018-08-14 15:10:39.944 [http-nio-20002-exec-9]: connection [RequestFacade@46515328] out and result = [slept].
2018-08-14 15:10:39.960 [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] in and status = true.
2018-08-14 15:10:49.960 [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] out and result = [slept].
ฉันดีบักโค้ดของ tomcat-embed-core และพบว่าเมื่อมีการร้องขอที่มี url ที่แตกต่างกันเข้ามา เธรด Poller สามารถตรวจจับได้ทันทีและประมวลผล ในขณะที่คำขอที่มี URL เดียวกันเข้ามา Poller จะไม่สามารถรับได้จนกว่าการเชื่อมต่อครั้งที่ 1 จะถูกส่งกลับ