Der JacORB Namensdienst
Überblick Beteiligte Klassen/Interfaces Realisierung der Namensdienst- Funktionalität Beispiel für POA-Einsatz mögliche Erweiterungen
Beteiligte Interfaces/Klassen IDL: idl/omg/CosNaming.idl Source code: src/org/jacorb/naming JacORB-Implementierung src/generated/org/omg/CosNaming vom IDL-Compiler aus OMG-Spezifikation generiert (Schnittstellen, Stubs, Helper/Holder)
UML > org.jacorb.naming. NamingContextExtImpl > org.omg.CosNaming. NamingContextExtPOA > java.io.Serializable > org.omg.CosNaming. NamingContextExtOperations org.jacorb.naming. Name > NamingContextExt
What‘s in a name? // CosNaming.idl typedef string Istring; struct NameComponent { Istring id; Istring kind; }; typedef sequence Name; interface NamingContext { Object resolve (in Name n) raises(...); }; interface NamingContextExt: NamingContext { typedef string StringName; StringName to_string(in Name n) raises(...);... }; // Name.java, JacORB utility class class Name { // c‘tors Name(); Name(NameComponent[]); Name(String); Name(NameComponent); NameComponent baseNameComponent(); String kind(); NameComponent components()[]; Name ctxName(); Name fullName(); String toString(); static NameComponent toName(String); static String toString(NameComponent[]); }
CosNaming.idl module CosNaming { interface NamingContext { //... void bind( in Name n, in Object obj) raises( NotFound, CannotProceed, InvalidName, AlreadyBound ); Object resolve (in Name n) raises( NotFound, CannotProceed, InvalidName ); }; //... };
NamingContextImpl.bind() void bind( NameComponent[] nc, org.omg.CORBA.Object obj ) throws NotFound, CannotProceed, InvalidName, AlreadyBound { Name n = new Name( nc ); Name ctx = n.ctxName(); NameComponent nb = n.baseNameComponent(); if( ctx == null ) { // bind here... } else { // bind in a nested context NameComponent[] ncx = new NameComponent[1]; ncx[0] = nb; NamingContextExtHelper.narrow( resolve(ctx.components())). bind(ncx,obj); } if( names.containsKey( n )) { throw new AlreadyBound(); } else if( contexts.containsKey( n )) { throw new AlreadyBound(); } names.put( n, obj ); }
resolve() public org.omg.CORBA.Object resolve( NameComponent[] nc ) throws NotFound, CannotProceed, InvalidName { Name n = new Name( nc[0] ); if( nc.length > 1 ) { // resolve in nested context } else { org.omg.CORBA.Object result = null; result = (org.omg.CORBA.Object)contexts.get(n); if( result == null ) result = (org.omg.CORBA.Object)names.get(n); if( result == null || result._non_existent()) throw new NotFound( NotFoundReason.missing_node, n.components()); return result; } NamingContextExt next_context = NamingContextExtHelper.narrow( (org.omg.CORBA.Object)contexts.get(n)); if ((next_context == null)||(next_context._non_existent())) { throw new NotFound( NotFoundReason.missing_node, nc ); } NameComponent[] nc_prime = new NameComponent[nc.length-1]; for( int i = 1; i < nc.length; i++) nc_prime[i-1] = nc[i]; return next_context.resolve(nc_prime); }....
POA Policies im Namensdienst Namensdienst soll runterfahren können, ohne daß es jemand merkt (Implementation Rep.) Context-Objekte müssen persistente Lebenszeit haben LifespanPolicyValue.PERSISTENT Beim Hochfahren sollen Objekte automatisch aktiviert werden RequestProcessingPolicyValue.USE_SERVANT_MANAGER Zustand aller Context-Objekte im Graph muß persistent in Dateien gehalten werden IdAssignmentPolicyValue.USER_ID NamingContextImpl ist Serializable
NameServer.main() public static void main( String args[] ) { // ORB and POA initialization orb = org.omg.CORBA.ORB.init( args, props ); POA rootPOA = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); org.omg.CORBA.Policy [] policies = new org.omg.CORBA.Policy[3]; policies[0] = rootPOA.create_id_assignment_policy( IdAssignmentPolicyValue.USER_ID); policies[1] = rootPOA.create_lifespan_policy( LifespanPolicyValue.PERSISTENT); policies[2] = rootPOA.create_request_processing_policy( RequestProcessingPolicyValue.USE_SERVANT_MANAGER); POA nsPOA = rootPOA.create_POA("NameServer-POA", rootPOA.the_POAManager(), policies);...
main() continued NameServantActivatorImpl servantActivator = new NameServantActivatorImpl( orb ); nsPOA.set_servant_manager( servantActivator._this(orb) ); nsPOA.the_POAManager().activate(); /* export the root context's reference to a file */ byte[] oid = ( new String("_root").getBytes() ); try { org.omg.CORBA.Object obj = nsPOA.create_reference_with_id( oid, "IDL:omg.org/CosNaming/NamingContextExt:1.0"); PrintWriter out = new PrintWriter( new FileOutputStream( args[0] ), true); out.println( orb.object_to_string( obj ) ); out.close(); } catch ( Exception e ) {...} Thread.sleep(time_out); orb.shutdown(true);
Servant Activator class NameServantActivatorImpl extends ServantActivatorPOA { private org.omg.CORBA.ORB orb = null; public NameServantActivatorImpl(org.omg.CORBA.ORB orb) { this.orb = orb; } public Servant incarnate(byte[] oid, POA adapter) throws ForwardRequest {} public void etherealize(byte[] oid, POA adapter, Servant servant, boolean cleanup_in_progress, boolean remaining_activations ) {} }
incarnate() public Servant incarnate(byte[] oid, POA adapter) throws ForwardRequest { String oidStr = new String( oid ); NamingContextImpl n = null; try { File f = new File( „_nsdb“ + oidStr ); if( f.exists() ) { FileInputStream f_in = new FileInputStream(f); if( f_in.available() > 0 ) { ObjectInputStream in = new ObjectInputStream(f_in); n = (NamingContextImpl)in.readObject(); in.close(); } f_in.close(); } catch( IOException io ){} catch( java.lang.ClassNotFoundException c ) { } if( n == null ) n = new NamingContextImpl(); n.init( orb, adapter); return n; }
etherealize() public void etherealize( byte[] object_id, POA adapter, Servant servant, // NamingContextImpl boolean cleanup_in_progress, boolean remaining_activations) { String oidStr = new String( object_id ); try { File file = new File("_nsdb" + oidStr); FileOutputStream fout = new FileOutputStream( file ); ObjectOutputStream out = new ObjectOutputStream( fout ); out.writeObject( (NamingContextImpl)servant ); } catch( IOException io ) { } }
Erweiterungsmöglichkeiten Load Balancing (nicht Standard) mehrere Objekte unter einem Namen anmelden, bei resolve() jedesmal eine andere Referenz herausgeben Skalierbarkeit bei wieviel Bindings/Clients/Anfragen liegt die Grenze, wie kann man sie verschieben? Performance keine systematischen Untersuchungen
Aufruf zur Mitarbeit an JacORB „Ruhm und Ehre“ Präsenz auf Mailinglisten, Newsgroups, etc. Forschen und Lernen Studien- und Diplomarbeiten Echte Software im industriellen Einsatz Evtl. Praktikum bei PrismTech in Newcastle, UK Open Source und Werkverträge Ideell: LGPL Kommerziell: Werkverträge möglich Relevanz für Arbeitsmarkt! JacORB an der FU halten!
Was tun? Kernentwicklung, Wartung CORBA-Kern, IDL/Java Language Mapping Asynchronous Message Invocation (AMI) Extensible Transport Framework (ETF) Fault Tolerance Security DFG-Projekt Raccoon Common Secure Interoperability (CSIv2) Services Notification, Persistence, etc. Support, Testen, Bug Fixes, Dokumentation Mailinglisten, Bugzilla, Testsuite (COST)
Wo anfangen? Website Buch: „Java Programming with CORBA“ Mailingliste: jacorb-developer AG SS DFG-Projekt Raccoon Studien- und Diplomarbeitsthemen Code und OMG-Spezifikationen lesen Nachfragen Werkverträge, Industriepraktika JacORB-Tutorial