0

タスクとして、クライアントが 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 の構造にあるのか、それともソートの実装に問題があるのか​​?

4

0 に答える 0