通过CORBA和RMI进行大规模排序?

时间:2013-10-16 16:20:21

标签: java sorting rmi corba

作为任务我开发了一个应用程序,以便 客户端 发送100万个数字数组CORBA服务器 。因此,服务器会将排序任务分发给几个从属

老实说,我根本不喜欢CORBA,并且要求会接受RMI,所以我去了在CORBA服务器中嵌入RMI。到目前为止,我可以获得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结构中的问题还是排序实现中的问题?

0 个答案:

没有答案