オブジェクトグループ

この例では、複数のオブジェクトをネームスペース内の同じ名前にバインドします。クライアントが名前を解決するたびに、潜在的に異なるオブジェクトを取得できます。

1 Helloの実装

Hello実装を変更して、Helloオブジェクトのインスタンスについて取り上げているのかがわかるようにします。
package objectGroup;
                                                                           
import helloWorld2.Hello;
import java.rmi.RemoteException;
import javax.rmi.PortableRemoteObject;
                                                                           
public class HelloImpl extends PortableRemoteObject implements Hello
{
    private int _i;
                                                                           
    HelloImpl(int i) throws RemoteException
    {
    |   _i = i;
    }
                                                                           
    public String sayHello() throws RemoteException
    {
    |   return "Hello World from " + _i + "!\n";
    }
}

2 Helloサーバ

最初にインプロセスNameServiceを作成します。2つのHelloオブジェクトを、addメソッドを使用して同じ名前にバインドします。次に、IRSを使用してNameServiceのルートをパブリッシュします。

この例では、同じプロセスで実行中の2つのオブジェクトを使用します。別のプロセスで実行中のオブジェクト、および別のマシンで実行中のオブジェクトをバインドすることもできます。

package objectGroup;
                                                                           
import javax.rmi.PortableRemoteObject;
                                                                           
import com.sssw.jbroker.api.naming.Access;
import com.sssw.jbroker.api.naming.NameService;
import com.sssw.jbroker.api.naming.AccessPolicy;
import com.sssw.jbroker.api.naming.NameServiceFactory;
                                                                           
import org.omg.CORBA.ORB;
import org.omg.CORBA.Object;
import org.omg.CosNaming.NameComponent;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.LifespanPolicyValue;
                                                                           
import com.sssw.jbroker.api.naming.NamingContext;
import com.sssw.jbroker.api.bootstrap.InitialReferencesService;
                                                                           
import helloWorld2.Hello;
                                                                           
public class helloServer
{
    public static void main(String[] args)
    {
    |   try {
    |   |   // create the ORB
    |   |   ORB orb = (ORB) org.omg.CORBA.ORB.init(args, null);
    |   |                                                                  
    |   |   // get the NameService Factory
    |   |   NameServiceFactory factory = (NameServiceFactory) orb.
    |   |       resolve_initial_references("NameServiceFactory");
    |   |                                                                  
    |   |   // get the root POA and activate it
    |   |   POA rootPOA = (POA) orb.resolve_initial_references("RootPOA");
    |   |   rootPOA.the_POAManager().activate();
    |   |                                                                  
    |   |   // create a transient in-process NameService
    |   |   NameService nameService = factory.createNameService(
    |   |       rootPOA, "ns1", LifespanPolicyValue.TRANSIENT, null, null);
    |   |                                                                  
    |   |   // print the root naming context
    |   |   NamingContext rootCtx = nameService.getRootNamingContext();
    |   |   System.out.println(orb.object_to_string(rootCtx));
    |   |                                                                  
    |   |   // publish some objects in it
    |   |   Hello hello1 = new HelloImpl(1);
    |   |   Hello hello2 = new HelloImpl(2);
    |   |   NameComponent nc = new NameComponent("hello", "");
    |   |   NameComponent[] name = new NameComponent[] { nc };
    |   |   rootCtx.add(name, (Object) PortableRemoteObject.toStub(hello1));
    |   |   rootCtx.add(name, (Object) PortableRemoteObject.toStub(hello2));
    |   |                                                                  
    |   |   // publish root naming context in initial naming
    |   |   InitialReferencesService irs = (InitialReferencesService) orb.
    |   |       resolve_initial_references("InitialReferencesService");
    |   |   irs.bind("NameService", rootCtx, false);
    |   |                                                                  
    |   |   // wait for invocations
    |   |   orb.run();
    |   |                                                                  
    |   } catch (Exception ex) {
    |   |   ex.printStackTrace();
    |   }
    }
}

3 Helloクライアント

クライアントは、Helloオブジェクトにアクセスするために、標準的なJNDI/COSバックエンドを使用します。
package objectGroup;
                                                                           
import util.Util;
import helloWorld2.Hello;
                                                                           
import org.omg.CORBA.ORB;
                                                                           
import java.util.Hashtable;
                                                                           
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
                                                                           
public class helloClient
{
    public static void main(String[] args)
    {
    |   try {
    |   |                                                                  
    |   |   // create the jBroker ORB
    |   |   ORB orb = ORB.init(args, null);
    |   |                                                                  
    |   |   // create the JNDI Environment
    |   |   Hashtable env = new Hashtable(5, 0.75f);
    |   |   env.put("java.naming.corba.orb", orb);
    |   |                                                                  
    |   |   // get the root naming context
    |   |   Context ctx = new InitialContext(env);
    |   |                                                                  
    |   |   for (int i=0; i < 10; i++) {
    |   |   |   // lookup the hello objref
    |   |   |   Hello hello = (Hello) ctx.lookup("hello");
    |   |   |                                                              
    |   |   |   // invoke method on the object
    |   |   |   System.out.println(hello.sayHello());
    |   |   }
    |   |                                                                  
    |   } catch (Exception ex) {
    |   |   ex.printStackTrace();
    |   }
    }
}

4 クライアント出力

クライアントが実行中のとき、クライアントからの要求が2つの別のサーバントに「ラウンドロビンされる」方法を示す次の出力が得られます。
Hello World from 1!

Hello World from 2!

Hello World from 1!

Hello World from 2!

Hello World from 1!

Hello World from 2!

Hello World from 1!

Hello World from 2!

Hello World from 1!

Hello World from 2!

5 CORBA APIの明示的な使用を持たないクライアント

このセクションでは、CORBA APIを明示的に使用せずにクライアントを書き換えます。、このサンプルを機能させるには、システムプロパティjava.naming.provider.urliiop://localhost:7777に設定する必要があります。

このクライアントを実行する場合、クライアント要求が2つの異なるサーバントに「ラウンドロビンされる」ことを再び確認できます。

package objectGroup;
                                                                           
import util.Util;
import helloWorld2.Hello;
                                                                           
import org.omg.CORBA.ORB;
                                                                           
import java.util.Hashtable;
                                                                           
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
                                                                           
//
// Note:set -Djava.naming.provider.url=iiop://localhost:7777
//
                                                                           
public class helloClient2
{
    public static void main(String[] args)
    {
    |   try {
    |   |                                                                  
    |   |   // get the root naming context
    |   |   Context ctx = new InitialContext();
    |   |                                                                  
    |   |   for (int i=0; i < 10; i++) {
    |   |   |                                                              
    |   |   |   // lookup the object
    |   |   |   Hello hello = (Hello) ctx.lookup("hello");
    |   |   |                                                              
    |   |   |   // invoke method on the object
    |   |   |   System.out.println(hello.sayHello());
    |   |   }
    |   |                                                                  
    |   } catch (Exception ex) {
    |   |   ex.printStackTrace();
    |   }
    }
}
Copyright © 2000-2003, Novell, Inc.All rights reserved.