Hasil Asinkron Spring RestController

Entri blog http://farazdagi.com/blog/2014/rest-long-running-jobs (serta sumber daya yang direferensikan) merekomendasikan penggunaan skenario berikut saat menggunakan REST untuk menunggu pekerjaan yang berjalan lama

  • Segera kembalikan payload jika hasilnya sudah tersedia saat mengembalikan permintaan. Sepertinya permintaan standar dengan kode status OK.
  • Tanggapi dengan kode status DITERIMA dan tambahkan Lokasi serta header Async-Result agar klien mengetahui bahwa mereka harus ...
  • Lakukan polling lokasi yang dikembalikan menggunakan GET dan tunggu hingga header Async-Result berubah menjadi Tersedia atau Dibatalkan.
  • Jika Tersedia, kode status SEE_OTHER dan header Lokasi lainnya dikembalikan. Ikuti lokasinya untuk mendapatkan hasilnya.

Saya tahu bahwa saya dapat kembali, mis. a CompletableFuture dari suatu metode, tetapi ini akan memblokir permintaan hingga masa depan selesai. Apakah ada dukungan untuk perilaku seperti itu di Spring MVC atau adakah cara agar saya dapat meningkatkan Spring MVC untuk mengimplementasikan perilaku ini, (misalnya menerapkan org.springframework.web.method.support.HandlerMethodReturnValueHandler ?)


person Peter Rietzler    schedule 09.05.2017    source sumber
comment
Anda sudah bisa melakukan ini. Tidak ada yang menghalangi Anda melakukan ini dengan @RestController biasa... Anda akan memiliki 1 metode yang mengembalikan 1 atau 2. Dalam kasus 2, klien Anda perlu melakukan polling pada URL yang diberikan (yang dapat Anda terapkan). Anda tidak memerlukan sesuatu yang khusus untuk ini.   -  person M. Deinum    schedule 09.05.2017


Jawaban (1)


Untuk mencapai perilaku yang direkomendasikan dalam postingan blog tersebut dengan Spring, Anda tidak harus mengembalikan CompletableFuture dari pengontrol Anda kecuali masa depan tersebut telah selesai (kode status harus 201 dalam kasus ini).

Jika tidak, Anda harus membuat respons kosong hanya dengan header Location (berisi URL tugas pembuatan) dan kode status 202 dan mengembalikan kode tersebut, jika isDone() mengembalikan false untuk masa depan Anda.

person Costi Ciudatu    schedule 09.05.2017