ผลลัพธ์ Async ของ Spring RestController

โพสต์ในบล็อก http://farazdagi.com/blog/2014/rest-long-running-jobs (รวมถึงทรัพยากรที่อ้างอิง) แนะนำให้ใช้สถานการณ์ต่อไปนี้เมื่อใช้ REST เพื่อรองานที่รันระยะยาว

  • ส่งคืนเพย์โหลดทันทีหากผลลัพธ์มีอยู่แล้วเมื่อส่งคืนคำขอ ดูเหมือนคำขอมาตรฐานที่มีรหัสสถานะตกลง
  • ตอบกลับด้วยรหัสสถานะที่ยอมรับแล้ว และเพิ่มตำแหน่งรวมถึงส่วนหัว Async-Result เพื่อให้ลูกค้ารับรู้ว่าพวกเขาควร ...
  • สำรวจตำแหน่งที่ส่งคืนโดยใช้ GET และรอจนกระทั่งส่วนหัว Async-Result เปลี่ยนเป็น Available หรือ Cancelled
  • ในกรณีที่พร้อมใช้งาน รหัสสถานะ SEE_OTHER และส่วนหัวของสถานที่อื่นจะถูกส่งกลับ ติดตามสถานที่เพื่อรับผลลัพธ์

ฉันรู้ว่าฉันสามารถกลับมาได้เช่น a CompletableFuture จากวิธีการ แต่จะบล็อกคำขอจนกว่าอนาคตจะเสร็จสมบูรณ์ มีการรองรับพฤติกรรมดังกล่าวใน Spring MVC หรือมีวิธีใดบ้างที่ฉันสามารถปรับปรุง Spring MVC เพื่อใช้พฤติกรรมนี้ (เช่น การใช้ org.springframework.web.method.support.HandlerMethodReturnValueHandler ?)


person Peter Rietzler    schedule 09.05.2017    source แหล่งที่มา
comment
คุณสามารถทำสิ่งนี้ได้แล้ว ไม่มีอะไรป้องกันคุณจากการทำเช่นนี้ด้วย @RestController ปกติ... คุณจะมี 1 วิธีที่ส่งคืน 1 หรือ 2 ในกรณีที่ 2 ไคลเอ็นต์ของคุณจำเป็นต้องสำรวจ URL ที่กำหนด (ซึ่งคุณสามารถใช้ได้) คุณไม่จำเป็นต้องมีอะไรที่กำหนดเองสำหรับสิ่งนี้   -  person M. Deinum    schedule 09.05.2017


คำตอบ (1)


เพื่อให้บรรลุพฤติกรรมที่แนะนำในบล็อกโพสต์กับ Spring คุณควรไม่ส่งคืน CompletableFuture จากตัวควบคุมของคุณ เว้นแต่ว่าอนาคตนั้นจะเสร็จสมบูรณ์แล้ว (รหัสสถานะควรเป็น 201 ในกรณีนี้)

มิฉะนั้น คุณควรสร้างการตอบกลับที่ว่างเปล่าโดยมีเพียงส่วนหัว Location (ประกอบด้วย URL งาน ที่สร้าง) และรหัสสถานะ 202 แล้วส่งคืนรหัสนั้นแทน หาก isDone() ส่งคืน false สำหรับอนาคตของคุณ

person Costi Ciudatu    schedule 09.05.2017