11. januar 2003 - 15:50Der er
56 kommentarer og 1 løsning
RMI og CORBA
Er der nogle, som kan forklare mig, hvordan RMI (Remote Method Invocation) og CORBA (Common Object Request Broker Architecture) virker? Og helst på dansk...tak.
Begge teknologier bruges til at distribuere objekter. De bruges i forbindelse med programmering hvor det kan være en fordel at fordele sin applikation over et netværk. RMI er en Java only teknologi som er utrolig nem at bruge (hvis man programmerer Java). CORBA er sproguafhængigt og kræver lidt mere af programmøren at få op at stå.
Traditionelle netværksprotokoller som f.eks. http, ftp, dns virker ved socket forbindelse (som er lag 4 i OSI modellen). Distribueret objekt fungere i højere lag, da både syntaks og semantik varetages af protokollen (Endian, Datatyper, osv.).
Det er et eksempel på det man kalder et proxy pattern (hvis du har studeret GoF patterns).
Ideen er at du kode-mæssigt kalder en metode, der reeelt bliver udført på en anden maskine, som om det var lokal kode der kørte på din egen maskine.
Rent praktisk foregår det ved at der bliver genereret stub kode til client og skeleton kode til server.
Client koden kalder stub koden som har præcis de samme metoder som på server. Stub koden serialiserer argumenterne og sender dem over netværket til skeleton koden som så deserialiserer og kalder server koden.
RMI er en implementation af dette i Java.
CORBA er en ret stor sag, som jeg ikke engang vil forsøge at forklare her (jeg er heller ikke skrap til CORBA !).
Det er et fuldt framework for distrbuted computing ligesom DCOM og J2EE.
Jo - det I har været inde på her, var de ting, som jeg vidste i forvejen. Jeg har brug for noget til bundsgående forklaring (og eksempler - gerne i javakode), da jeg har studeret dette en del, men ikke helt er med på, hvordan det egentlig fungerer. Som eksempler kan det bare være nogle små programer, som f.eks. sender en sætning fra 1 computer over til 1 anden computer. Håber der er nogle, som stadig kan hjælpe?
Et andet spørgsmål (vedrørende det samme emne): kan man køre sådan en forbindelse, compilere programet og starte RMI-registry fra alle computere? Altså nogle som har et programeringsværktøj til f.eks. Java? Eller skal man have noget specielt installeret?
Okay; men RMI var også den leteste af de 2 muligheder (efter min mening). Så nu mangler vi (læs "jeg") bare at få en forklaring (forståelse) for CORBA...? (og måske noget teknisk viden om NamingService'n i RMI(DNS))
---------- Compilerings processen kan jeg faktisk ikke huske - andet end at en betaversion af idltojava skulle bruges for at få det til at virke. Men koden virker.. :-)
public static void main(String args[]) { try { // create and initialize the ORB ORB orb = ORB.init(args, null);
// get reference to rootpoa & activate the POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();
// create servant and register it with the ORB HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb);
// get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref);
// get the root naming context // NameService invokes the name service org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// Use NamingContextExt which is part of the Interoperable // Naming Service (INS) specification. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// bind the Object Reference in Naming String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href);
System.out.println("HelloServer ready and waiting ...");
// wait for invocations from clients orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); }
public class HelloClient { static Hello helloImpl;
public static void main(String args[]) { try { // create and initialize the ORB ORB orb = ORB.init(args, null);
// get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt instead of NamingContext. This is // part of the Interoperable naming Service. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// resolve the Object Reference in Naming String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
System.out.println("Obtained a handle on server object: " + helloImpl); System.out.println(helloImpl.sayHello()); helloImpl.shutdown();
Jeg har prøvet, at skrive det første program ned i java. Det vil også godt kompileres. Men jeg kan ikke få den til at køre "rmic". Og det er her, hvor jeg er i tvivl, om man skal have et specielt program, eller nogle specielle filer, for at man kan få en RMI-forbindelse op at stå??
Nej, ikke rigtigt. Jeg læser til eksamen for tiden, så jeg har ikke for meget tid ;-) Men derfor vil jeg skam gerne stadig have et eksempel på CORBA....?
Jeg har nu prøvet, at skrive det samme eksempel, som der er skrevet herinde. Men "module"'et vil ikke kompileres (og efterfølgende heller ingen af de andre). Det er vel fordi, jeg kompilerer dem inde fra Forte af? Hvordan lyder kompileringskommandoerne ude fra prompten af?
Jeg har ikke lige en windows maskine her, men jeg vil tro at dette virker: idlj -fall Interface.idl javac *.java HelloApp/*.java start orbd -ORBInitialPort 1050 & start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost & start java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
Hvordan laver jeg det interface til den rette type? Altså hvis jeg bare laver en alm. interfacefil i Forte, så har filen efternavnet "java". Men filen skal jo gerne hedder "idl"?
Hvis jeg bruger "start"-kommandoen, så kommer der et nyt vindue frem, som hurtigt forsvinder igen. Hvis jeg skriver kommandoen uden "start", så kommer der en lang fejlmelding. Hvorfor gør der det, og hvad betyder den? (jeg har selvfølgelig kørt idlj først)
Sådan ser fejlen ud:
C:\CorbaTest>java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost ERROR: org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No at com.sun.corba.se.internal.iiop.ConnectionTable.getConnection(Connecti onTable.java:148) at com.sun.corba.se.internal.iiop.ConnectionTable.getConnection(Connecti onTable.java:65) at com.sun.corba.se.internal.iiop.GIOPImpl.getConnection(GIOPImpl.java:6 7) at com.sun.corba.se.internal.corba.ClientDelegate.createRequest(ClientDe legate.java:638) at com.sun.corba.se.internal.corba.ClientDelegate.createRequest(ClientDe legate.java:580) at com.sun.corba.se.internal.corba.InitialNamingClient.resolve(InitialNa mingClient.java:1004) at com.sun.corba.se.internal.corba.InitialNamingClient.resolveUsingBoots trapProtocol(InitialNamingClient.java:687) at com.sun.corba.se.internal.corba.InitialNamingClient.cachedInitialRefe rences(InitialNamingClient.java:1085) at com.sun.corba.se.internal.corba.InitialNamingClient.resolve_initial_r eferences(InitialNamingClient.java:978) at com.sun.corba.se.internal.corba.ORB.resolve_initial_references(ORB.ja va:2422) at HelloServer.main(HelloServer.java:43) HelloServer Exiting ...
Hvis ikke det virker så prøv lige at poste output fra de andre vinduer også. (Jeg kender ikke specielt meget til CORBA, men mon ikke "CORBA.COMM_FAILURE" betyder noget med at der ikke kunne kommunikeres - altså får den ikke fat i noget "i den anden ende".)
C:\CorbaTest>javac *.java HelloApp/*.java HelloClient.java:18: cannot resolve symbol symbol : class Hello location: class HelloClient static Hello helloImpl; ^ HelloServer.java:69: cannot resolve symbol symbol : class HelloPOA location: class HelloImpl class HelloImpl extends HelloPOA ^ HelloClient.java:36: cannot resolve symbol symbol : variable HelloHelper location: class HelloClient helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); ^ HelloServer.java:38: cannot resolve symbol symbol : class Hello location: class HelloServer Hello href = HelloHelper.narrow(ref); ^ HelloServer.java:38: cannot resolve symbol symbol : variable HelloHelper location: class HelloServer Hello href = HelloHelper.narrow(ref); ^ 5 errors
Okay - nu er vi da ved at komme nogle vejne... Jeg har nu leget lidt med det, og har fået reduceret fejlantallet til 3. Jeg tror, at fejlen er noget med, at jeg ikke har installeret de defaulte CORBA-filer i java på min computer?
Fejlen ser således ud:
C:\CorbaTest>javac *.java HelloApp/*.java HelloImpl.java:1: cannot resolve symbol symbol : class HelloPOA location: class HelloImpl class HelloImpl extends HelloPOA ^ HelloImpl.java:3: cannot resolve symbol symbol : class ORB location: class HelloImpl private ORB orb; ^ HelloImpl.java:5: cannot resolve symbol symbol : class ORB location: class HelloImpl public void setORB(ORB orb_val) ^ 3 errors
Jamen, HelloPOA er da slet ikke en fil, jeg har/skal lave. Den står da ikke i eksemplet ovenover. Desuden mener jeg også, at noget-POA-noget er noget med CORBA-teknologien. Det var derfor, at jeg skrev, at jeg troede, det var noget med den generelle CORBA-teknologifiler, som jeg ikke havde installeret ordentlig på min computer...?
Nu har jeg opdateret til 1.4.1, men jeg får stdig dette problem:
C:\CorbaTest>javac *.java HelloApp/*.java HelloImpl.java:1: cannot resolve symbol symbol : class HelloPOA location: class HelloImpl class HelloImpl extends HelloPOA ^ HelloImpl.java:3: cannot resolve symbol symbol : class ORB location: class HelloImpl private ORB orb; ^ HelloImpl.java:5: cannot resolve symbol symbol : class ORB location: class HelloImpl public void setORB(ORB orb_val) ^ 3 errors
where <options> includes: -port Activation Port where the ORBD should be started, defa lt 1049 (optional) -defaultdb Directory for ORBD files, default "./orb.db" (optional
-serverid Server Id for ORBD, default 1 (optional) -ORBInitialPort Initial Port (required) -ORBInitialHost Initial HostName (required)
org.omg.CORBA.INTERNAL: vmcid: SUN minor code: 209 completed: No at com.sun.corba.se.internal.iiop.GIOPImpl.createListener(GIOPImpl.java 253) at com.sun.corba.se.internal.iiop.GIOPImpl.getEndpoint(GIOPImpl.java:20 ) at com.sun.corba.se.internal.POA.POAORB.setPersistentServerPort(POAORB. ava:445) at com.sun.corba.se.internal.POA.POAORB.parseProperties(POAORB.java:271
at com.sun.corba.se.internal.Interceptors.PIORB.parseProperties(PIORB.j va:341) at com.sun.corba.se.internal.corba.ORB.set_parameters(ORB.java:458) at com.sun.corba.se.internal.POA.POAORB.set_parameters(POAORB.java:153) at com.sun.corba.se.internal.Interceptors.PIORB.set_parameters(PIORB.ja a:333) at org.omg.CORBA.ORB.init(ORB.java:346) at com.sun.corba.se.internal.Activation.ORBD.createORB(ORBD.java:99) at com.sun.corba.se.internal.Activation.ORBD.run(ORBD.java:109) at com.sun.corba.se.internal.Activation.ORBD.main(ORBD.java:327)
C:\CorbaTest>
Hvad betyder dette???
Soreno har skrevet de kopileringskomandoer ned, som jeg skal bruge. Men ved nogle af dem står der "&" sidst i linien. Jeg går ud fra, at dette tegn ikke skal skrives, men det blot er skrevet herinde til "hjælp", så man (jeg) kan se, at jeg skal skrive FLERE linier???
Jeg har ikke haft tid til at prøve siden sidst...men nu får herren, som gav eksemplerne, point...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.