Memulai Java RMI

1. Ikhtisar

Ketika dua JVM perlu berkomunikasi, Java RMI adalah salah satu opsi yang kami miliki untuk mewujudkannya. Dalam artikel ini, kami akan mem-bootstrap contoh sederhana yang menampilkan teknologi Java RMI.

2. Membuat Server

Ada dua langkah yang diperlukan untuk membuat server RMI:

  1. Buat antarmuka yang menentukan kontrak klien / server.
  2. Buat implementasi antarmuka itu.

2.1. Mendefinisikan Kontrak

Pertama-tama, mari buat antarmuka untuk objek jarak jauh. Antarmuka ini memperluas antarmuka penanda java.rmi.Remote .

Selain itu, setiap metode yang dideklarasikan dalam antarmuka melempar java.rmi. RemoteException :

public interface MessengerService extends Remote { String sendMessage(String clientMessage) throws RemoteException; }

Namun, perhatikan bahwa RMI mendukung spesifikasi Java lengkap untuk tanda tangan metode, selama jenis Java mengimplementasikan java.io.Serializabl e .

Kita akan melihat di bagian selanjutnya, bagaimana klien dan server akan menggunakan antarmuka ini.

Untuk server, kami akan membuat implementasi, sering disebut sebagai Remote Object .

Untuk klien, pustaka RMI secara dinamis akan membuat implementasi yang disebut Stub .

2.2. Penerapan

Selanjutnya, mari kita implementasikan antarmuka jarak jauh, lagi-lagi disebut Objek Jarak Jauh :

public class MessengerServiceImpl implements MessengerService { @Override public String sendMessage(String clientMessage) { return "Client Message".equals(clientMessage) ? "Server Message" : null; } public String unexposedMethod() { /* code */ } }

Perhatikan, bahwa kita telah meninggalkan klausa throws RemoteException dari definisi metode.

Objek jarak jauh kami tidak akan menampilkan RemoteException karena pengecualian ini biasanya dicadangkan untuk pustaka RMI untuk meningkatkan kesalahan komunikasi ke klien.

Meninggalkannya juga memiliki manfaat untuk menjaga penerapan RMI-agnostik.

Selain itu, metode tambahan apa pun yang ditentukan dalam objek jarak jauh, tetapi tidak dalam antarmuka, tetap tidak terlihat oleh klien.

3. Mendaftarkan Layanan

Setelah kami membuat implementasi jarak jauh, kami perlu mengikat objek jarak jauh ke registri RMI.

3.1. Membuat Stub

Pertama, kita perlu membuat sebuah rintisan dari objek jarak jauh kita:

MessengerService server = new MessengerServiceImpl(); MessengerService stub = (MessengerService) UnicastRemoteObject .exportObject((MessengerService) server, 0);

Kami menggunakan metode UnicastRemoteObject.exportObject statis untuk membuat implementasi rintisan kami. Stub adalah keajaiban komunikasi dengan server melalui protokol RMI yang mendasarinya.

Argumen pertama untuk exportObject adalah objek server jarak jauh.

Argumen kedua adalah port yang digunakan exportObject untuk mengekspor objek jarak jauh ke registri.

Memberikan nilai nol menunjukkan bahwa kita tidak peduli port mana yang digunakan exportObject , yang khas dan dipilih secara dinamis.

Sayangnya, metode exportObject () tanpa nomor port tidak digunakan lagi.

3.2 Membuat Registry

Kami dapat membuat registri lokal ke server kami atau sebagai layanan yang berdiri sendiri terpisah.

Untuk kesederhanaan, kami akan membuat yang lokal ke server kami:

Registry registry = LocateRegistry.createRegistry(1099);

Ini membuat registri di mana stub dapat diikat oleh server dan ditemukan oleh klien.

Selain itu, kami telah menggunakan metode createRegistry , karena kami membuat registri lokal ke server.

Secara default, registri RMI berjalan pada port 1099. Sebaliknya, port yang berbeda juga dapat ditentukan di metode pabrik createRegistry .

Tetapi dalam kasus yang berdiri sendiri, kami akan memanggil getRegistry , meneruskan nama host dan nomor port sebagai parameter.

3.3 Mengikat Stub

Akibatnya, mari ikat rintisan kita ke registri. Registri RMI adalah fasilitas penamaan seperti JNDI dll. Kita dapat mengikuti pola serupa di sini, mengikat rintisan kita ke kunci unik:

registry.rebind("MessengerService", stub); 

Akibatnya, objek jauh sekarang tersedia untuk semua klien yang dapat menemukan registri.

4. Membuat Klien

Terakhir, mari tulis klien untuk memanggil metode jarak jauh.

Untuk melakukan ini, pertama-tama kami akan mencari registri RMI. Selain itu, kita akan mencari rintisan objek jarak jauh menggunakan kunci unik yang dibatasi.

Dan terakhir, kami akan memanggil metode sendMessage :

Registry registry = LocateRegistry.getRegistry(); MessengerService server = (MessengerService) registry .lookup("MessengerService"); String responseMessage = server.sendMessage("Client Message"); String expectedMessage = "Server Message"; assertEquals(expectedMessage, responseMessage);

Karena kami menjalankan registri RMI di mesin lokal dan port default 1099, kami tidak meneruskan parameter apa pun ke getRegistry .

Memang, jika registri berada pada host yang berbeda atau port yang berbeda, kami dapat menyediakan parameter ini.

Setelah kami mencari objek rintisan menggunakan registri, kami dapat menjalankan metode di server jarak jauh.

5. Kesimpulan

Dalam tutorial ini, kami mendapat pengantar singkat tentang Java RMI dan bagaimana itu bisa menjadi dasar untuk aplikasi klien-server. Nantikan postingan tambahan tentang beberapa fitur unik RMI!

Kode sumber dari tutorial ini dapat ditemukan di GitHub.