Pertanyaan Cara menggabungkan spring-data-rest dengan spring websocket menjadi implementasi tunggal


Saya ingin menyinkronkan negara ke semua klien yang tertarik pada perubahan entitas tertentu. Jadi saya ingin mencapai sesuatu seperti:

  • mengekspos CRUD API pada entitas (via HTTP/REST dan websockets)
  • dan routing respons (dari memodifikasi panggilan) ke websockets tema

Jadi secara teknis, saya tertarik dengan ide untuk bercampur pegas-data-istirahat dengan implementasi spring websockets untuk mencapai sesuatu seperti spring-data-websocket.

Ada dua solusi yang muncul di benak saya, dan sebenarnya keduanya adalah:

  • spring-data-rest untuk mengekspos entitas saya melalui REST/HTTP API
  • websocket pengendali (digunakan untuk panggilan modifikasi pada entitas)

Itu websocket kontroler akan terlihat seperti ini:

@Controller
public class EntityAWebSocketController {
      @MessageMapping("/EntityA/update")
      @SendTo("/topic/EntityA/update")
      public EntityA update(EntityA entityA) throws Exception {
           // persist,....
           return entityA;
     }
}

Skenario 1: Websocket API dipanggil dari REST/HTTP API

Aturan:

  • permintaan klien selalu REST/HTTP API
  • tanggapannya adalah REST/HTTP API untuk semua operasi
  • apalagi untuk memodifikasi operasi websocket pesan juga datang

Secara teknis, dapat dicapai, oleh:

  • memanggil websocket pengendali dari Peristiwa semi-istirahat-data (yaitu di AfterCreateEvent, AfterSaveEvent, AfterLinkSaveEvent, AfterDeleteEvent)

Masih solusinya sepertinya cukup sakit untuk saya, karena saya harus pergi untuk:

  1. klien A -HTTP request -> Server (pengendali spring-data-rest)
  2. Server (AfterXXXEvent dalam kontroler spring-data-rest) -websocket pesan -> Musim Semi websocket pengontrol
  3. Kontroler websocket musim semi -websocket pesan melalui topik -> semua Klien tertarik dengan topik ini
  4. Server (pengendali spring-data-rest) -HTTP respons -> klien A

Skenario 2: Websocket API independen dari REST API

Aturan:

  • permintaan klien REST/HTTP API untuk operasi non-modifikasi saja
  • tanggapannya adalah REST/HTTP API untuk operasi non-modifikasi saja
  • klien mengirim websocket pesan untuk semua operasi modifikasi
  • websocket pesan dikirim ke klien untuk semua operasi modifikasi saja

Nah, jika tidak ada ide lain yang muncul, saya akan pergi untuk yang nanti, tapi tetap saja, akan sangat bagus jika saya entah bagaimana bisa menghasilkan C(R)UD metode yang diekspos melalui websockets juga, sesuatu seperti spring-data-websockets dan hanya menangani rute dalam implementasi saya.

Karena saya merasa seperti saya harus secara manual mengekspos (via *WebSocketControllers) semua CUD metode untuk semua entitas saya. Dan saya mungkin terlalu malas untuk itu.

Ide ide?


32
2018-01-22 08:58


asal


Jawaban:


Skenario 2 berbicara tentang, pada langkah terakhir, satu klien. Tapi saya pikir kebutuhan Anda adalah untuk suatu topik karena Anda menginginkan banyak klien. Jika saya ingin menyelesaikan 2 untuk persyaratan yang Anda nyatakan, maka Anda mungkin ingin mempertahankan daftar klien dan menerapkan antrean Anda sendiri atau gunakan ForkJoinPool untuk mengirim pesan ke semua klien Anda yang mendengarkan di WebSockets Anda. Karena itu, topik A pasti lebih elegan di sini tetapi secara keseluruhan terlihat terlalu rumit dengan antarmuka yang berbeda

Untuk semua pesan dari klien ke server, cukup gunakan protokol kawat sederhana dan gunakan koleksi untuk menentukan parameternya, bisa juga RParam1 .......

Di server, Anda memerlukan pengontrol untuk memetakan ini ke berbagai permintaan (dan operasi). Entah bagaimana tidak terlihat seperti terlalu banyak pekerjaan. Semoga ini membantu.


1
2018-06-21 17:33