作为一项任务,我必须开发一个应用程序,以便客户端将 100 万个数字数组发送到CORBA 服务器。所以服务器会将排序任务分配给几个从站。
老实说,我根本不喜欢 CORBA,而且要求会接受 RMI,所以我决定将 RMI 嵌入到 CORBA 服务器中。到目前为止,我可以让 CORBA 服务器抓住 RMI,但是,我没有让数组排序。
我将描述程序的各个部分以及它们之间的关系。
CORBA 服务器
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 结构中的问题还是排序实现中的问题?