C/Visual C - CORBA - OmniNames

 
Vista:

CORBA - OmniNames

Publicado por Angel (1 intervención) el 27/05/2005 10:04:23
Hola,

Estoy desarrollando una aplicación en CORBA desde Visual C++.
Consigo crear objetos en el servidor y enlazar con su referencia, esto es, su IOR desde un cliente para hacer llamadas a sus métodos por interfaz remota. Todo esto lo hago mediante un fichero de texto que escribo y leo para obtener el IOR.
Estoy tratando de utilizar un NameService para olvidarme del ficherito con las IOR y empezar a desarrollar la aplicación realmente en distribuido.
Mi código del servidor es el siguiente:

--------------------------------------------------------------------------------------

//////////////////////////////////////////////////////////////////////

static CORBA::Boolean
bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref)
{
CosNaming::NamingContext_var rootContext;

try {
// Obtain a reference to the root context of the Name service:
CORBA::Object_var obj;
obj = orb->resolve_initial_references("NameService");

// Narrow the reference returned.
rootContext = CosNaming::NamingContext::_narrow(obj);
if( CORBA::is_nil(rootContext) ) {
cerr << "Failed to narrow the root naming context." << endl;
return 0;
}
}
catch(CORBA::ORB::InvalidName& ex) {
// This should not happen!
cerr << "Service required is invalid [does not exist]." << endl;
return 0;
}

try {
// Bind a context called "test" to the root context:

CosNaming::Name contextName;
contextName.length(1);
contextName[0].id = (const char*) "test"; // string copied
contextName[0].kind = (const char*) "my_context"; // string copied
// Note on kind: The kind field is used to indicate the type
// of the object. This is to avoid conventions such as that used
// by files (name.type -- e.g. test.ps = postscript etc.)

CosNaming::NamingContext_var testContext;
try {
// Bind the context to root.
testContext = rootContext->bind_new_context(contextName);
}
catch(CosNaming::NamingContext::AlreadyBound& ex) {
// If the context already exists, this exception will be raised.
// In this case, just resolve the name and assign testContext
// to the object returned:
CORBA::Object_var obj;
obj = rootContext->resolve(contextName);
testContext = CosNaming::NamingContext::_narrow(obj);
if( CORBA::is_nil(testContext) ) {
cerr << "Failed to narrow naming context." << endl;
return 0;
}
}

// Bind objref with name Echo to the testContext:
CosNaming::Name objectName;
objectName.length(1);
objectName[0].id = (const char*) "Echo"; // string copied
objectName[0].kind = (const char*) "Object"; // string copied

try {
testContext->bind(objectName, objref);
}
catch(CosNaming::NamingContext::AlreadyBound& ex) {
testContext->rebind(objectName, objref);
}
// Note: Using rebind() will overwrite any Object previously bound
// to /test/Echo with obj.
// Alternatively, bind() can be used, which will raise a
// CosNaming::NamingContext::AlreadyBound exception if the name
// supplied is already bound to an object.

// Amendment: When using OrbixNames, it is necessary to first try bind
// and then rebind, as rebind on it's own will throw a NotFoundexception if
// the Name has not already been bound. [This is incorrect behaviour -
// it should just bind].
}
catch(CORBA::COMM_FAILURE& ex) {
cerr << "Caught system exception COMM_FAILURE -- unable to contact the "
<< "naming service." << endl;
return 0;
}
catch(CORBA::SystemException&) {
cerr << "Caught a CORBA::SystemException while using the naming service."
<< endl;
return 0;
}

return 1;
}

//////////////////////////////////////////////////////////////////////

int
main(int argc, char **argv)
{
try {
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);

Echo_i* myecho = new Echo_i();

PortableServer::ObjectId_var myechoid = poa->activate_object(myecho);

// Obtain a reference to the object, and register it in
// the naming service.
obj = myecho->_this();

CORBA::String_var x;
x = orb->object_to_string(obj);
cerr << x << "\n";

if( !bindObjectToName(orb, obj) )
return 1;

myecho->_remove_ref();

PortableServer::POAManager_var pman = poa->the_POAManager();
pman->activate();

orb->run();
}
catch(CORBA::SystemException&) {
cerr << "Caught CORBA::SystemException." << endl;
}
catch(CORBA::Exception&) {
cerr << "Caught CORBA::Exception." << endl;
}
catch(omniORB::fatalException& fe) {
cerr << "Caught omniORB::fatalException:" << endl;
cerr << " file: " << fe.file() << endl;
cerr << " line: " << fe.line() << endl;
cerr << " mesg: " << fe.errmsg() << endl;
}
catch(...) {
cerr << "Caught unknown exception." << endl;
}

return 0;
}

.....................................................................................................

Lanzo la aplicación de omniNamex.exe con los siguientes parámetros:
omniNames.exe -start 12345 .. . . . .
Parece que está corriendo. Lo ejecuto en modo consola y no como servicio, y parece estar corriendo.
Si ejecuto este servidor me da un error de excepción.
catch(CORBA::SystemException&) {
cerr << "Caught CORBA::SystemException." << endl;
}

Sin embargo, si sustituyo la línea:
obj = orb->resolve_initial_references("NameService");
por la siguiente:
obj = orb->resolve_initial_references("corbaloc:iio:localhost:12345/NameService");

Ya no me da el error de ese error de excepción sino otro:
catch(CORBA::ORB::InvalidName& ex) {
// This should not happen!
cerr << "Service required is invalid [does not exist]." << endl;
return 0;

¿Alguien me puede explicar qué está pasando?
Es totalmente obligatorio correr el omniNames como servicio, y si lo es, ¿por qué?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder