Memblokir itu buruk, karena mengikat utas menunggu tanggapan. Ini sangat buruk dalam kerangka reaktif yang memiliki sedikit utas, dan dirancang sedemikian rupa sehingga tidak ada dari mereka harus diblokir secara tidak perlu.
Ini adalah hal yang harus dihindari oleh kerangka kerja reaktif, jadi dalam hal ini Anda hanya akan berhenti melakukannya:
Kode baru Anda, sebaliknya, bekerja secara asinkron. Utas tidak diblokir, karena tidak ada yang benar-benar terjadi hingga repositori mengembalikan nilai (dan kemudian lambda yang Anda berikan ke savedQuote.subscribe()
dijalankan, mencetak hasil Anda ke konsol.)
Namun, kode baru masih belum optimal / normal dari perspektif aliran reaktif, karena Anda melakukan semua logika Anda dalam metode berlangganan. Hal normal yang harus kita lakukan adalah serangkaian panggilan flatMap/map untuk mengubah item dalam aliran, dan menggunakan doOnNext()
untuk efek samping (seperti mencetak nilai):
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
Jika Anda melakukan pekerjaan serius dengan aliran reaktor / reaktif, ada baiknya membacanya secara umum. Mereka sangat kuat untuk pekerjaan non-pemblokiran, tetapi mereka membutuhkan cara berpikir (dan pengkodean) yang berbeda dari Java yang lebih "standar".