タスクとして、クライアントが 100 万個の数値配列をCORBA サーバーに送信するアプリを開発する必要がありました。そのため、サーバーはソート タスクを少数のスレーブに分散します。
正直なところ、私は CORBA がまったく好きではありません。要件では RMI を受け入れることになるので、RMI を CORBA サーバー内に埋め込むことにしました。これまでのところ、CORBA サーバーが RMI を占有することはできますが、配列をソートすることはできません。
プログラムの一部とそれらの間の関係について説明します。
コルバサーバー
import sorting.*;
public class Servidor {
public static void main(String[] args) {
try {
// 1. Inicializar ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
// 2.1 Obtener POA raiz
POA raizPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
// 2.2 Activar el POA manager
raizPOA.the_POAManager().activate();
// 3.1 Crear instancia de la implementación (servant)
propiedadesImplementacion servant = new propiedadesImplementacion();
// 3.2 Registrar en el POA y obtener referencia al objeto (IOR)
org.omg.CORBA.Object sortingCORBA = raizPOA.servant_to_reference(servant);
// 4.1 Obtener el initial naming context
org.omg.CORBA.Object ncCorba = orb.resolve_initial_references("NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncCorba);
// 4.2 Asociar un nombre (en el primer nivel)
nc.rebind(nc.to_name("Proyecto"), sortingCORBA);
// 5 Quedar a la espera de peticiones
System.out.println("Proceso servidor en espera ... ");
Runtime.getRuntime().exec("rmiregistry");
Thread.sleep(1000);
ObjetoRemoto or = new ObjetoRemoto();
Naming.rebind("//localhost/ObjetoRemoto", or);
System.out.println("Conexión establecida");
orb.run();
} catch (Exception e) {
System.out.println("Error:" + e.getMessage());
System.exit(1);
}
}
}
CORBA メソッドの実装
public class propiedadesImplementacion extends ServidorProyectoPOA {
public propiedadesImplementacion() {
}
public int[] ordenar(int [] a) {
int[] sub1 = Arrays.copyOfRange(a,0,199999);
int[] sub2 = Arrays.copyOfRange(a,200000,399999);
int[] sub3 = Arrays.copyOfRange(a,400000,599999);
int[] sub4 = Arrays.copyOfRange(a,600000,799999);
int[] sub5 = Arrays.copyOfRange(a,800000,999999);
try {
Registry registry = LocateRegistry.getRegistry("localhost");
InterfazRMI i = (InterfazRMI )registry.lookup("objetoRemoto");
sub1 = i.ordenarRMI(sub1);
sub2 = i.ordenarRMI(sub2);
sub3 = i.ordenarRMI(sub3);
sub4 = i.ordenarRMI(sub4);
sub5 = i.ordenarRMI(sub5);
sub2 = merge(sub1, sub2);
sub3 = merge(sub2, sub3);
sub4 = merge(sub3, sub4);
sub5 = merge(sub4, sub5);
Arrays.sort(sub5);
}
catch (Exception e) {}
return sub5;
}
private int[] merge(int[] a, int[] b) {
int aLen = a.length;
int bLen = b.length;
int[] c= new int[aLen+bLen];
System.arraycopy(a, 0, c, 0, aLen);
System.arraycopy(b, 0, c, aLen, bLen);
return c;
}
}
CORBA クライアント
import sorting.*;
public class Cliente {
public static void main(String[] args) {
try {
// 1. Inicializar ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
// 2.1 Obtener instancia del servidor de nombres (initial naming context)
org.omg.CORBA.Object ncCorba = orb.resolve_initial_references("NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncCorba);
// 2.2 Construir el nombre del objeto y obtener ref. desde servidor de nombres
org.omg.CORBA.Object clienteCorba = nc.resolve(nc.to_name("Proyecto"));
// 2.4 Convertir el objeto CORBA al tipo Propiedades (narrow)
ServidorProyecto sp = ServidorProyectoHelper.narrow(clienteCorba);
// 3 Invocar métodos remotos
int [] a = new int[1000000];
Random r = new Random();
for (int i=0; i<1000000; i++) {
a[i] = r.nextInt(1000000)+1;
// System.out.print(a[i] + " ");
}
a = sp.ordenar(a);
for (int i=0; i<1000000; i++) {
System.out.print(a[i] + " ");
}
}
catch (Exception e) {
System.out.println("Error:" + e.getMessage());
System.exit(1);
}
}
}
したがって、クライアントは単純に配列を生成し (この場合はテスト用)、ordenar(int[])
メソッドを呼び出します。そのメソッドは、サーバーによって以前に起動された RMI によって登録されたいくつかのメソッドを実際に呼び出します。返された配列は正確にソートされていません。問題は CORBA-RMI の構造にあるのか、それともソートの実装に問題があるのか?