Name-Service

Die Verwendung des Name-Service ist ein typisches Henne-Ei-Problem: wie gelangt das Programm an die Objekt-Referenz des Name-Service?

Die CORBA-Spezifikation sieht dazu lediglich die Methode resolve_initial_reference vor, die dazu verwendet werden kann. Allerdings ist nicht spezifiziert, wie eine CORBA-Implementierung nun zu den notwendigen Informationen kommt, um sie über resolve_initial_reference zurückzugeben. Meist lassen sich über Kommandozeilenparameter oder über eine implementierungsspezifische Konfigurationsdatei die Objektreferenzen zu den Services angeben. Ein zweites dabei auftretendes Problem ist noch, dass Objektreferenzen dynamisch erzeugt werden, dh sie können bei jedem Start des Servers unterschiedlich sein. Dafür bieten wiederum alle vernünftigen Implementierungen eine Konfigurationsmöglichkeit an, sodass sich der TCP/IP-Port und die Objektreferenz eines Servers fest einstellen lassen, sodass die Objektreferenz des Servers immer konstant bleibt. Auch der Portable Object Adapter trägt seinen Teil dazu mit der Lifespan-Policy PERSISTENT bei.

Mittlerweile wurde das Problem auch von der OMG erkannt, worauf nun eine Interoperable Name Service Spezifikation (siehe [23]) in Arbeit ist. Diese beschreibt eine ORB-übergreifende Möglichkeit zur Konfiguration der Initial References über -ORBInitRef und -ORBDefaultInitRef. Darüber hinaus beschreibt sie auch noch die Angabe von Objekt-Referenzen über IIOP/CORBA-URLs. Früher wurden diese mit iioploc und iiopname gekennzeichnet, in der neuesten Version der Spezifikation hat sich dies auf corbaloc und corbaname geändert, um in Zukunft die Einbindung anderer Protokolle als IIOP zu erleichtern. Allerdings fehlt in der Spezifiaktion zumindest noch die Definition des Default-Ports für den Naming-Service, der noch bei der IANA (bzw. ICANN) registriert werden muss.

Beispiel: ORBacus

Bei Verwendung von ORBacus kann jedem CORBA-Server mit dem Kommandozeilenparameter -OAport ein fester Port zugewiesen werden, sodass der Server jedesmal die selbe Objekt-Referenz bekommt.

Zur Konfiguration der initial references besitzt diese Implementierung die Kommandozeilenparameter -ORBnaming und -ORBservice.

Die Version 3.2 (und auch 4.0b1) unterstützt zumindest schon teilweise eine frühe Version der Interoperable Name Service Spezifikation.

Beispiel: omniORB

OmniORB verfolgt einen ähnlichen Ansatz wie ORBacus. Der Name-Service von omniORB kann auf einen festen Port gelegt werden (Option -start von omniNames), sodass die Objekt-Referenz konstant bleibt.

Um Clients die initial NameService Referenz zur Verfügung zu stellen, verwendet omniORB die Konfigurationsdatei omniORB.cfg.

Verwendung des Naming-Services

Etwas verwirrend bei der Verwendung des Name-Service scheint auf den ersten Blick die Unterscheidung zwischen id und kind zu sein. Es kann jedoch im Zweifelsfall bedenkenlos kind einfach leer gelassen werden.

Beispiel 1. Namen in den Naming-Service eintragen

CORBA::Object_var nameObj =
  orb->resolve_initial_references("NameService");
CosNaming::NamingContext_var nameService =
  CosNaming::NamingContext::_narrow(nameObj);

// Naming-Context erstellen (falls noch nicht vorhanden)
CosNaming::Name name1;
name1.length(1);
name1[0].id = CORBA::string_dup("MyContext");
name1[0].kind = CORBA::string_dup("");
try
{
  CosNaming::NamingContext_var namingContext =
    nameService->bind_new_context(name1);
}
catch (CosNaming::NamingContext::AlreadyBound &)
{
  // koennen wir hier ignorieren
}

CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("MyName");
name[0].kind = CORBA::string_dup("");
try
{
  if (!CORBA::is_nil(namingContext))
  {
    namingContext->rebind(name, obj);
  }
}
catch (CosNaming::NamingContext::InvalidName &)
{
  // ungueltiger Name
}

Beispiel 2. Auflösung von Namen zu Objektreferenzen

CORBA::Object_var nameObj =
  orb->resolve_initial_references("NameService");
CosNaming::NamingContext_var nameService =
  CosNaming::NamingContext::_narrow(nameObj);


CosNaming::Name name;
name.length(2);
name[0].id = CORBA::string_dup("MyContext");
name[0].kind = CORBA::string_dup("");
name[1].id = CORBA::string_dup("Name");
name[1].kind = CORBA::string_dup("");

try
{
  CORBA::Object_var obj = nameService->resolve(name);

  std::cout << "erfolgreich" << std::endl;
}
catch (CosNaming::NamingContext::NotFound &)
{
  std::cout << "nicht gefunden" << std::endl;
}
catch (CORBA::Exception &)
{
  std::cout << "NameService Fehler" << std::endl;
}