Bermula dengan RMI Java

1. Gambaran keseluruhan

Apabila dua JVM perlu berkomunikasi, RMI Java adalah salah satu pilihan yang harus kita lakukan. Dalam artikel ini, kami akan menggunakan contoh ringkas yang mempamerkan teknologi RMI Java.

2. Membuat Pelayan

Terdapat dua langkah yang diperlukan untuk membuat pelayan RMI:

  1. Buat antara muka yang menentukan kontrak pelanggan / pelayan.
  2. Buat pelaksanaan antara muka itu.

2.1. Menentukan Kontrak

Pertama sekali, mari kita buat antara muka untuk objek jauh. Antaramuka ini meluaskan antara muka penanda java.rmi.Remote .

Di samping itu, setiap kaedah yang dinyatakan di antara muka melemparkan java.rmi. Pengecualian Jauh :

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

Namun, perhatikan bahawa RMI menyokong spesifikasi Java penuh untuk tandatangan kaedah, selagi jenis Java menerapkan java.io.Serializabl e .

Kami akan melihat di bahagian yang akan datang, bagaimana pelanggan dan pelayan akan menggunakan antara muka ini.

Untuk pelayan, kami akan membuat pelaksanaan, yang sering disebut sebagai Objek Jauh .

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

2.2. Pelaksanaan

Selanjutnya, mari kita laksanakan antara muka jarak jauh, yang dipanggil lagi Objek 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, bahawa kita telah meninggalkan klausa lemparan RemoteException dari definisi kaedah.

Tidak biasa objek jarak jauh kita membuang RemoteException kerana pengecualian ini biasanya dikhaskan untuk perpustakaan RMI untuk meningkatkan kesalahan komunikasi kepada pelanggan.

Meninggalkannya juga mempunyai faedah menjaga pelaksanaan RMI-agnostik.

Juga, kaedah tambahan yang ditentukan dalam objek jauh, tetapi tidak di antara muka, tetap tidak dapat dilihat oleh klien.

3. Mendaftarkan Perkhidmatan

Sebaik sahaja kita membuat pelaksanaan jarak jauh, kita perlu mengikat objek jauh ke pendaftaran RMI.

3.1. Membuat Stub

Pertama, kita perlu membuat rintisan objek jauh kita:

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

Kami menggunakan kaedah UnicastRemoteObject.exportObject statik untuk membuat pelaksanaan stub kami. Rintisan adalah apa keajaiban berkomunikasi dengan pelayan melalui protokol RMI yang mendasari.

Argumen pertama untuk mengeksportObject adalah objek pelayan jauh.

Argumen kedua adalah port yang digunakan oleh exportObject untuk mengeksport objek jauh ke registri.

Memberi nilai sifar menunjukkan bahawa kita tidak peduli eksport pelabuhan mana yang digunakan, yang biasa dan dipilih secara dinamik.

Malangnya, kaedah exportObject () tanpa nombor port tidak digunakan lagi.

3.2 Membuat Pendaftaran

Kami boleh membuat pendaftaran tempatan ke pelayan kami atau sebagai perkhidmatan tersendiri yang berasingan.

Untuk kesederhanaan, kami akan membuat yang sesuai dengan pelayan kami:

Registry registry = LocateRegistry.createRegistry(1099);

Ini membuat pendaftaran yang stub dapat diikat oleh pelayan dan ditemui oleh pelanggan.

Juga, kami telah menggunakan kaedah createRegistry , kerana kami membuat pendaftaran tempatan ke pelayan.

Secara lalai, pendaftaran RMI berjalan di port 1099. Sebaliknya, port yang berbeza juga dapat ditentukan dalam kaedah kilang createRegistry .

Tetapi dalam kes yang berdiri sendiri, kami memanggil getRegistry , memberikan nama host dan nombor port sebagai parameter.

3.3 Mengikat Stub

Oleh itu, mari kita mengikat rintisan kita ke pendaftaran. Pendaftaran RMI adalah kemudahan penamaan seperti JNDI dll. Kita boleh mengikuti corak serupa di sini, mengikat rintisan kita dengan kunci unik:

registry.rebind("MessengerService", stub); 

Akibatnya, objek jauh kini tersedia untuk setiap pelanggan yang dapat mencari registri.

4. Menciptakan Pelanggan

Akhirnya, mari tulis pelanggan untuk menggunakan kaedah jarak jauh.

Untuk melakukan ini, pertama-tama kita akan mencari pendaftaran RMI. Sebagai tambahan, kami akan mencari rintisan objek jauh menggunakan kunci unik yang dibatasi.

Dan akhirnya, kami akan menggunakan kaedah sendMessage :

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

Oleh kerana kami menjalankan pendaftaran RMI pada mesin tempatan dan port lalai 1099, kami tidak memberikan parameter apa pun ke getRegistry .

Sesungguhnya, jika pendaftaran menggunakan hos atau port yang berlainan, kami dapat memberikan parameter ini.

Setelah kami mencari objek rintisan menggunakan registri, kami dapat menggunakan kaedah pada pelayan jauh.

5. Kesimpulan

Dalam tutorial ini, kami mendapat pengenalan ringkas mengenai RMI Java dan bagaimana ia dapat menjadi asas untuk aplikasi pelayan pelanggan. Nantikan catatan tambahan mengenai beberapa ciri unik RMI!

Kod sumber tutorial ini boleh didapati di GitHub.