0

作为一项任务,我必须开发一个应用程序,以便客户端将 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 结构中的问题还是排序实现中的问题?

4

0 回答 0