ฉันมีบริการ REST ที่ใช้กับ JAX-RS การดำเนินการบางอย่างใช้เวลานานจึงจะเสร็จสมบูรณ์ อาจใช้เวลาประมาณ 15-30 นาที ในกรณีเหล่านี้ ความชอบของฉันคือส่งเธรดพื้นหลังเพื่อประมวลผลการดำเนินการที่ใช้เวลานาน จากนั้นตอบสนองทันทีด้วยสถานะ HTTP 202 ACCEPTED การตอบกลับจะมีส่วนหัวของสถานที่พร้อม URL ที่ลูกค้าสามารถใช้เพื่อสำรวจความคืบหน้า
วิธีการนี้จำเป็นต้องมีการสร้างเธรดเพื่อรองรับการดำเนินการที่รันเป็นเวลานาน ซึ่งสามารถส่งคืน 202 ACCEPTED ได้ทันที ฉันรู้ด้วยว่าโดยทั่วไปแล้วการสร้างเธรดของคุณเองในคอนเทนเนอร์ Java EE ถือเป็นแนวทางปฏิบัติที่ไม่ดี!
คำถามของฉันมีดังนี้:
- ผู้คนเห็นพ้องกันว่านี่เป็นแนวทางที่ถูกต้องหรือไม่?
- สมมติว่าถูกต้อง ผู้คนสามารถแนะนำโซลูชัน 'แนวปฏิบัติที่ดี' ที่ช่วยให้ฉันสามารถส่งการดำเนินการที่ใช้เวลานานในเบื้องหลังและกลับมาได้ทันทีได้หรือไม่
นอกจากนี้ เพื่อหลีกเลี่ยงการจัดการเธรดของตัวเอง ฉันจึงดู API ของเซิร์ฟเวอร์อะซิงโครนัส JAX-RS น่าเสียดายที่แม้ว่าสิ่งนี้จะปรับปรุงปริมาณงานของเซิร์ฟเวอร์ แต่ก็ไม่อนุญาตให้ฉันตอบกลับทันทีโดยยอมรับแล้ว
เจอร์ซีย์ระบุดังต่อไปนี้:
Note that the use of server-side asynchronous processing model will not improve the
request processing time perceived by the client. It will however increase the
throughput of the server, by releasing the initial request processing thread back to
the I/O container while the request may still be waiting in a queue for processing or
the processing may still be running on another dedicated thread. The released I/O
container thread can be used to accept and process new incoming request connections.
ความช่วยเหลือใด ๆ ที่ชื่นชม ขอบคุณ!