Spring Remoting dengan RMI

1. Gambaran keseluruhan

Java Remote Menghubungi Invokasi membolehkan memohon objek yang tinggal di yang lain Java Virtual Machine . Ini adalah teknologi yang mapan namun sedikit membebankan untuk digunakan, seperti yang dapat kita lihat di jejak Oracle rasmi yang khusus untuk subjek ini.

Dalam artikel ringkas ini, kita akan meneroka bagaimana Spring Remoting memungkinkan memanfaatkan RMI dengan cara yang lebih mudah dan bersih.

Artikel ini juga melengkapkan gambaran keseluruhan Spring Remoting . Anda boleh mendapatkan perincian mengenai teknologi lain yang disokong dalam ansuran sebelumnya: HTTP Invokers, JMS, AMQP, Hessian, dan Burlap.

2. Pergantungan Maven

Seperti yang kita lakukan dalam artikel sebelumnya, kita akan menyediakan beberapa aplikasi Spring Boot : pelayan yang memaparkan objek yang dapat dipanggil jauh dan klien yang meminta perkhidmatan yang terdedah.

Semua yang kami perlukan ada di dalam balang konteks musim bunga - jadi kami dapat membawanya dengan menggunakan apa sahaja penolong Spring Boot yang kami sukai - kerana tujuan utama kami adalah hanya menyediakan perpustakaan utama.

Sekarang mari kita maju dengan web spring-boot-starter-biasa - ingat untuk membuang kebergantungan Tomcat untuk mengecualikan perkhidmatan web terbenam:

 org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-tomcat   

3. Aplikasi Pelayan

Kami akan mula menyatakan antara muka yang menentukan perkhidmatan untuk menempah perjalanan dengan teksi, yang akhirnya akan terdedah kepada pelanggan:

public interface CabBookingService { Booking bookRide(String pickUpLocation) throws BookingException; }

Kemudian kita akan menentukan kacang yang menerapkan antara muka. Inilah kacang yang benar-benar akan melaksanakan logik perniagaan di pelayan:

@Bean CabBookingService bookingService() { return new CabBookingServiceImpl(); }

Mari terus menyatakan Pengeksport yang menyediakan perkhidmatan untuk pelanggan. Dalam kes ini, kami akan menggunakan RmiServiceExporter :

@Bean RmiServiceExporter exporter(CabBookingService implementation) { Class serviceInterface = CabBookingService.class; RmiServiceExporter exporter = new RmiServiceExporter(); exporter.setServiceInterface(serviceInterface); exporter.setService(implementation); exporter.setServiceName(serviceInterface.getSimpleName()); exporter.setRegistryPort(1099); return exporter; }

Melalui setServiceInterface () kami memberikan rujukan ke antara muka yang akan dibuat dari jarak jauh.

Kita juga harus memberikan rujukan ke objek yang benar-benar menjalankan kaedah dengan setService () . Kami kemudian dapat menyediakan port pendaftaran RMI yang tersedia di mesin di mana pelayan berjalan jika kami tidak mahu menggunakan port lalai 1099.

Kita juga harus menetapkan nama perkhidmatan, yang memungkinkan untuk mengenal pasti perkhidmatan yang terdedah dalam pendaftaran RMI .

Dengan konfigurasi yang diberikan, pelanggan akan dapat menghubungi CabBookingService di URL berikut: rmi: // HOST: 1199 / CabBookingService .

Mari akhirnya memulakan pelayan. Kami sendiri tidak perlu memulakan pendaftaran RMI kerana Spring akan melakukannya secara automatik untuk kami sekiranya pendaftaran tersebut tidak tersedia.

4. Permohonan Pelanggan

Mari tulis sekarang aplikasi pelanggan.

Kami mula menyatakan RmiProxyFactoryBean yang akan membuat kacang yang mempunyai paparan antara muka yang sama dengan perkhidmatan yang berjalan di sisi pelayan dan yang akan secara telus mengarahkan permintaan yang akan diterimanya ke pelayan:

@Bean RmiProxyFactoryBean service() { RmiProxyFactoryBean rmiProxyFactory = new RmiProxyFactoryBean(); rmiProxyFactory.setServiceUrl("rmi://localhost:1099/CabBookingService"); rmiProxyFactory.setServiceInterface(CabBookingService.class); return rmiProxyFactory; }

Mari kita tulis kod ringkas yang memulakan aplikasi pelanggan dan menggunakan proksi yang ditentukan pada langkah sebelumnya:

public static void main(String[] args) throws BookingException { CabBookingService service = SpringApplication .run(RmiClient.class, args).getBean(CabBookingService.class); Booking bookingOutcome = service .bookRide("13 Seagate Blvd, Key Largo, FL 33037"); System.out.println(bookingOutcome); }

Sekarang sudah cukup untuk melancarkan klien untuk mengesahkan bahawa ia meminta perkhidmatan yang didedahkan oleh pelayan.

5. Kesimpulan

Dalam tutorial ini, kita melihat bagaimana kita dapat menggunakan Spring Remoting untuk meredakan penggunaan RMI yang sebaliknya memerlukan serangkaian tugas yang membosankan seperti, antara lain, memutar pendaftaran dan menentukan perkhidmatan menggunakan antara muka yang menggunakan pengecualian yang diperiksa.

Seperti biasa, anda akan menemui sumbernya di GitHub.