Tot sobre el registre RMI de Java i com utilitzar-lo

Tot sobre el registre RMI de Java i com utilitzar-lo

RMI significa invocació de mètode remot i, com el seu nom indica, és un protocol per a un programa Java per invocar un mètode d’un objecte que s’executa en un altre ordinador. Proporciona una API (interfície de programació d'aplicacions) per exportar un objecte des d'un programa (anomenat servidor) i invocar els mètodes d'aquest objecte des d'un altre programa (anomenat client), possiblement executant-se en un equip diferent.





El Java Registre RMI és un component clau del sistema Java RMI i proporciona un directori centralitzat per als servidors per registrar serveis i per als clients que cerquen aquests serveis. En aquest article, aprenem a implementar un servidor per exposar un objecte i un client per invocar un mètode al servidor, així com registrar i buscar el servei al registre RMI.





com veure qui et va bloquejar a instagram

Declaració de la interfície del servidor

Per conèixer les complexitats de com funciona el sistema Java RMI, implementem un simple objecte de servidor que proporciona un mètode per acceptar un nom i retornar una salutació. Aquí teniu la definició de la interfície objecte:





import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote
{
public String greet(String name) throws RemoteException;
}

Es diu el nom de la interfície Salutació . Proporciona un mètode únic anomenat saludar () que accepta un nom i retorna una salutació adequada.

Per marcar aquesta interfície com a exportable, cal ampliar el fitxer java.rmi.Remote interfície. El mètode també ha de declarar a llança llistat de clàusules java.rmi.RemoteException a més de qualsevol excepció específica de l’aplicació. Això és així perquè el codi del client pugui gestionar (o propagar) errors d'invocació de mètodes remots com host-not-found , fallada de connexió , Etc.



Implementació de l'objecte servidor

Després de declarar la interfície (que fan servir els clients), implementem l'objecte lateral del servidor i proporcionem el fitxer saludar () com es mostra. Utilitza una cadena de format senzill per formatar la salutació.

public class GreetingObject implements Greeting
{
private String fmtString = 'Hello, %s';
public String greet(String name)
{
return String.format(this.fmtString, name);
}
}

El mètode principal del servidor

Ara reunim totes aquestes peces i implementem el fitxer main () mètode del servidor. Passem per cadascun dels passos rellevants.





  • El primer pas és crear la implementació d'objectes del servidor. Greeting greeting = new GreetingObject();
  • A continuació, obtenim un taló per a l'objecte servidor del temps d'execució RMI. El taló implementa la mateixa interfície que l'objecte servidor. Tanmateix, el mètode implementa la comunicació necessària amb l'objecte del servidor remot. Aquest client l'utilitza per invocar de forma transparent el mètode a l'objecte servidor. Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
  • Un cop obtingut el taló, el lliurem al registre RMI per unir-lo a un servei especificat. Quan el client sol·licita una implementació d’aquest servei, rep el registre que sap comunicar-se amb l’objecte servidor. A continuació, el mètode estàtic LocateRegistry.getRegistry () s’utilitza per obtenir la referència del registre local. El rebind () A continuació, s’utilitza el mètode per lligar el nom al taló. String name = 'Greeting';
    Registry registry = LocateRegistry.getRegistry(port);
    registry.rebind(name, stub);

El mètode principal complet.

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Main
{
static public void main(String[] args) throws Exception
{
if ( args.length == 0 ) {
System.err.println('usage: java Main port#');
System.exit(1);
}
int index = 0;
int port = Integer.parseInt(args[index++]);
String name = 'Greeting';
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println('Greeting bound to '' + name + ''');
}
}

Construint el servidor

Analitzem ara la creació del servidor. Per simplificar les coses, construïm utilitzant la línia d’ordres a Linux en lloc d’utilitzar una eina de compilació com Maven.





A continuació es compilen els fitxers font als fitxers de classe d'un directori de destinació.

rm -rf target
mkdir target
javac -d target src/server/*.java

Recopileu els fitxers de classe en un fitxer JAR per executar-los.

jar cvf target/rmi-server.jar -C target server

També recopilem els fitxers d'interfície necessaris per compilar el client en una biblioteca JAR.

jar cvf target/rmi-lib.jar -C target server/Greeting.class

Implementació del client

Analitzem ara la implementació del client utilitzat per invocar els mètodes d'objecte del servidor.

  • Igual que amb el servidor, obteniu una referència al registre, especificant el nom d'amfitrió on s'executa el registre i el número de port. Registry registry = LocateRegistry.getRegistry(host, port);
  • A continuació, cerqueu el servei al registre. El Cercar() torna un mètode que es pot utilitzar per invocar serveis. Greeting greeting = (Greeting) registry.lookup(name);
  • I invoca el mètode passant els arguments necessaris. Aquí rebem la salutació passant el nom i imprimint-lo. System.out.println(name + ' reported: ' + greeting.greet(myName));

El codi de client complet:

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client
{
static public void main(String[] args) throws Exception
{
if ( args.length != 3 ) {
System.err.println('usage: java Client host port myName');
System.exit(1);
}
int index = 0;
String host = args[index++];
int port = Integer.parseInt(args[index++]);
String myName = args[index++];
String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + ' reported: ' + greeting.greet(myName));
}
}

El registre RMI

Executem ara el programa de servidor perquè pugui començar a publicar sol·licituds.

java -cp target/rmi-server.jar server.Main 1099
# throws
Exception in thread 'main' java.rmi.ConnectException: Connection refused to host: xxx; nested exception is:
java.net.ConnectException: Connection refused

Què és aquesta excepció ? Connexió rebutjada .

El motiu pel qual obteniu aquesta excepció és que: tingueu en compte el codi del servidor que intenta connectar-se al registre local al port 1099. Si això falla, acabareu amb aquesta excepció.

La solució és executar el registre RMI. El registre RMI és un programa que s’inclou amb la màquina virtual de Java i s’anomena rmiregistry . Hauria de situar-se al sóc directori de la instal·lació de la màquina virtual de Java. Executar-lo és tan senzill com:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry

Per defecte, el registre escolta al port 1099. Per fer-lo escoltar en un altre port, especifiqueu el número de port de la manera següent:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100

Comproveu que hi hagi un oient al port especificat amb l'ordre netstat :

quant de temps pot durar un MacBook Pro
netstat -an -t tcp -p | grep LISTEN
...
tcp6 0 0 :::1100 :::* LISTEN 23450/rmiregistry

Execució del servidor

Intentem ara tornar a executar el servidor.

java -cp target/rmi-server.jar server.Main 1100
# throws
java.rmi.UnmarshalException: error unmarshalling arguments
...
Caused by: java.lang.ClassNotFoundException: server.Greeting
...

Una excepció de nou! Què és aquesta vegada?

El servidor no pot carregar la classe d'interfície servidor.Salutació . Això passa perquè el registre RMI no pot carregar la classe requerida. Per tant, cal especificar la ubicació de les classes obligatòries. Una manera de fer-ho és especificar la variable d'entorn CLASSPATH:

CLASSPATH=../../junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100

Intentar tornar a executar el servidor dóna:

java -cp target/rmi-server.jar server.Main 1100
# prints
Greeting bound to 'Greeting'

Ara el servidor està funcionant.

Execució del client

Després de muntar i executar totes les parts, executar el client és senzill. Necessita els JAR adequats per a l'execució. Aquests inclouen la classe que conté el fitxer main () mètode i la classe de la interfície. Accepta arguments que indiquen on s’executa el registre RMI i un nom per a la salutació.

java -cp target/rmi-client.jar:target/rmi-lib.jar client.Client localhost 1100 Peter
# prints
Greeting reported: Hello, Peter

Resum

Java RMI proporciona una API i eines per facilitar l'execució de codi remot. Podeu implementar un servidor que registri un objecte de servei amb el registre RMI de Java. Els clients poden consultar el registre i obtenir un registre d'objectes de servei per invocar els mètodes de servei. Com il·lustra aquest exemple, és molt senzill.

Feu servir Java RMI al vostre projecte? Quina ha estat la vostra experiència? Hi ha alguna alternativa que hagi investigat? Feu-nos-ho saber en els comentaris següents.

Compartir Compartir Tweet Correu electrònic Una guia per a principiants d’animació de la parla

Animar la parla pot ser un repte. Si esteu preparat per començar a afegir diàlegs al vostre projecte, us desglossarem el procés.

Llegiu a continuació
Temes relacionats
  • Programació
  • Java
Sobre l'autor Jay Sridhar(17 articles publicats) Més de Jay Sridhar

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us