Code du serveur
L'application serveur doit créer une instance de l'objet distant et le publier dans un service de noms. L'interface JNDI (Java™ Naming and Directory Interface) définit un ensemble d'interfaces standard. Les interfaces sont utilisées pour interroger un service de noms ou pour lier un objet au service.
Context ctx = new InitialContext(...); // get hold of the initial context
ctx.bind("sample", sampleReference); // bind the reference to the name "sample"
Object obj = ctx.lookup("sample"); // obtain the reference- java.naming.factory.initial
- Défini également comme javax.naming.Context.INITIAL_CONTEXT_FACTORY. Cette propriété spécifie le nom de classe de la fabrique de contextes initiale du fournisseur de service de noms. Pour le registre RMI, le nom de classe est com.sun.jndi.rmi.registry.RegistryContextFactory. Pour le service CosNaming , le nom de classe est com.sun.jndi.cosnaming.CNCtxFactory.
- java.naming.provider.url
- Cette propriété configure le contexte d'affectation de nom racine, l'ORB (Object Request Broker)
ou les deux. Elle est utilisée lorsque le service de noms est stocké dans un hôte différent et elle peut prendre plusieurs schémas URI :
- interface du gestionnaire de ressources
- corbaname
- corbaloc
- Interoperable Object Reference
- iiop
- iiopname
rmi://[<host>[:<port>]][/<initial_context>] for RMI registry iiop://[<host>[:<port>]][/<cosnaming_name>] for COSNaming
Hashtable env = new Hashtable();
Env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory");et envoyer la table de hachage comme argument au constructeur InitialContext.Par exemple, avec RMI(JRMP), il suffit de créer une instance du servant et suivre les étapes précédentes pour lier cette référence dans le service de noms.
public class Server {
public static void main (String args []) {
try {
ORB orb = ORB.init(args, null);
// Get reference to the root poa & activate the POAManager
POA poa = (POA)orb.resolve_initial_references("RootPOA");
poa.the_POAManager().activate();
// Create a servant and register with the ORB
SampleImpl sample = new SampleImpl();
sample.setORB(orb);
// TIE model ONLY
// create a tie, with servant being the delegate and
// obtain the reference ref for the tie
SamplePOATie tie = new SamplePOATie(sample, poa);
Sample ref = tie._this(orb);
// Inheritance model ONLY
// get object reference from the servant
org.omg.CORBA.Object ref = poa.servant_to_reference(sample);
Sample ref = SampleHelper.narrow(ref);
// bind the object reference ref to the naming service using JNDI
..........(see previous code) .....
orb.run();
}
catch(Exception e) {}
}
}public class Server {
public static void main (String args []) {
try {
ORB orb = ORB.init(args, null);
// Get reference to the root poa & activate the POAManager
POA poa = (POA)orb.resolve_initial_references("RootPOA");
poa.the_POAManager().activate();
// Create servant and its tie
SampleImpl sample = new SampleImpl();
_SampleImpl_Tie tie = (_SampleImpl_Tie)Util.getTie(sample);
// get an usable object reference
org.omg.CORBA.Object ref = poa.servant_to_reference((Servant)tie);
// bind the object reference ref to the naming service using JNDI
..........(see previous code) .....
}
catch(Exception e) {}
}
}Pour utiliser le code de serveur POA (Portable Object Adapter) précédent, vous devez utiliser les options -iiop -poa ensemble pour permettre à rmic de générer le lien. Si vous n'utilisez pas le POA, le code de serveur RMI(IIOP) peut se réduire à instancier le servant (SampleImpl sample = new SampleImpl()). Vous liez ensuite le servant à un service de nommage comme c'est généralement le cas dans l'environnement RMI (JRMP). Dans ce cas, vous devez utiliser uniquement l'option -iiop pour permettre à rmic de générer le lien RMI-IIOP. Si vous omettez -iiop, le squelette RMI(JRMP) est généré.
Lorsque vous exportez un objet RMI-IIOP sur le serveur, vous n'avez pas nécessairement à choisir entre JRMP et IIOP. Si vous avez besoins d'un seul objet serveur pour prendre en charge les clients JRMP et IIOP, vous pouvez exporter l'objet RMI-IIOP vers JRMP et IIOP simultanément. Dans la terminologie RMI-IIOP, cette action s'appelle une exportation double.
public class SampleClient {
public static void main(String [] args) {
try{
Sample sampleref
//Look-up the naming service using JNDI and get the reference
.........
// Invoke method
System.out.println(sampleRef.message());
}
catch(Exception e) {}
}
} public class SampleClient {
public static void main (String [] args) {
try {
ORB orb = ORB.init(args, null);
// Look up the naming service using JNDI
......
// Narrowing the reference to the correct class
Sample sampleRef = SampleHelper.narrow(o);
// Method Invocation
System.out.println(sampleRef.message());
}
catch(Exception e) {}
}
}public class SampleClient {
public static void main (String [] args) {
try{
ORB orb = ORB.init(args, null);
// Retrieving reference from naming service
........
// Narrowing the reference to the correct class
Sample sampleRef = (Sample)PortableRemoteObject.narrow(o, Sample.class);
// Method Invocation
System.out.println(sampleRef.message());
}
catch(Exception e) {}
}
}