Académique Documents
Professionnel Documents
Culture Documents
1.Introduccin
1.1.Aplicacionesdistribuidas
1.1.1.Datosdistribuidos
1.1.2.Computacindistribuida
1.1.3.Usuariosdistribuidos
1.2.RealidaddelosSistemasDistribuidos
1.3.SistemadeObjetosDistribuidos
1.4.QuesCORBA?
1.4.1.ElOMG
1.4.2.LaarquitecturaCORBA
1.4.3.ElORB
1.4.4.CORBAcomounEstandarparaObjetosDistribuidos
1.4.5.ServiciosCORBA
1.4.6.ProductosCORBA
2.ProcesodedesarrolloenJavaIDL
2.1.DefinirelInterfazRemoto
2.2.CompilarelInterfazRemoto
2.3.ImplementarelServidor
2.4.ImplementarelCliente
2.5.Iniciarlasaplicaciones
3.Ejemplo"Helloworld"enCliente/Servidor
4.EscribirelinterfazIDL
4.1.EscribiendoHello.idl
4.1.1.DeclararelMduloIDLdeCORBA
4.1.2.DeclararlaInterface
4.1.3.DeclarandolasOperaciones
4.2.MapeandoHello.idldeIDLaJava
4.3.Comprendientolasalidadeidl2java
4.3.1._HelloImplBase.java
4.3.2._HelloStub.java
4.3.3.Hello.java
4.3.4.HelloHelper.java
4.3.5.HelloHolder.java
5.DesarrollodelCliente
5.1.Realizarunaconfiguracinbsica
5.1.1.Importandolospaquetesrequeridos
5.1.2.Declarandolaclasedelcliente
5.1.3.Definiendoelmtodomain
5.1.4.ManejandolasexcepcionesCORBA
5.2.CrearunobjetoORB
5.3.EncontrarelServidorHello
5.3.1.ObtenerelContextoInicialdeNombrado
5.3.2.AjustarlaReferenciaaObjeto
5.3.3.EncontrarunServiciodeNombrado
5.4.InvocandolaOperacinsayHello
6.DesarrollodelServidor
6.1.Realizandounaconfiguracinbsica
6.1.1.Importandolospaquetesrequeridos
6.1.2.Declarandolaclasedelservidor
6.1.3.Definiendoelmtodomain
6.1.4.ManejandolasexcepcionesCORBA
6.2.CrearunobjetoORB
6.3.AdministrandoelObjetoSirviente
6.3.1.InstanciandoelObjetoSirviente
6.3.2.DefiniendolaClaseSirviente
6.4.TrabajandoconelNombramientoCOS
6.4.1.ObteniendoelContextoInicialdeNombramiento
6.4.2.AjustandolaReferenciaaObjeto
6.4.3.RegistrarelSirvienteenelServidordeNombres
6.5.Esperandoalapeticin
7.Compilandoyejecutandolaaplicacin"HelloWorld"
7.1.CompilandoelCliente
7.2.CompilandoelServidor
7.3.EjecutandolaAplicacinCliente/Servidor
1.Introduccin
1.1.Aplicacionesdistribuidas
CORBAproprocionanunentornoparaeldesarrolloyejecucindeaplicacionesdistribuidas.Pero,porququeremosdistribuir
aplicaciones?.Ladisitribucindeaplicacionesintroduceunnuevoconjuntodedificultades.Sinembargo,algunavecesnohay
eleccinalgunasaplicaciones,porsunaturaleza,debenestardistribuidasatravsmultiplescomputadorasporalgunodeestos
motivos:
Laaplicacinutilizadatosdistribuidos.
Lacomputacinestdistribuida.
Losusuariosdelaaplicacinestndistribuidos.
1.1.1.Datosdistribuidos
Algunasaplicacionessedebenejecutarenvariosordenadoresporquelosdatosqueutilizalaaplicacinestnsituadosenmultiples
computadorasporcuestionesadministrativasodeseguridad.Elpropietariodebepermitirquesepuedaaccederaesosdatosde
formaremota.Quizslosdatosnopuedanestarsituadosenunmismoordenadorydebanestaresmltiplessistemasheterogneos
porrazoneshistricas.
1.1.2.Computacindistribuida
Algunasaplicacionesquerequierenmuchoclculoseejecutanenmltiplescomputadorasparaobtenerlaventajadepoder
ejecutarsedeformaparalelaenmltiplesprocesadores.Otrasaplicacionessepuedenejecutarenmltiplescomputadoraspara
aprovecharlascualidadesquenosbrindaunordenadorparticular.Lasaplicacionesdistribuidastienencomoventajalaescalabilidad
ylaheterogenidaddelossistemasdistribuidos.
1.1.3.Usuariosdistribuidos
Algunasaplicacionesseejecutanenmltiplescomputadoresporquelosusuariosdelaaplicacinsecomunicaneinteractanentres
mediantelapropiaaplicacin.Cadausuarioejecutaunapiezadelaaplicacindistribuidaensuordenador,ycomparteobjetosque
usanlosdemsusuariosdesdesusmquinas.Unaarquitecturatpicadeestetipodeaplicacionessemuestraacontinuacin:
1.2.RealidaddelosSistemasDistribuidos
Losdesarrolladoresdelossistemasdistribuidosdebentenerencuentaunaseriedecaractersticasquetienenencomnodiferencian
lossistemasdistribuidosdelossistemaslocales.Latablasiguienteindicadiferenciasquesepuedenencontrarentreobjetosqueestn
localizadosenunmismoproceso,yobjetosqueinteractanmsalldeloslmitesdeunprocesoounamquina:
Local Distribuido
Comuncacin Rpido Lento
Losobjetosfallanseparadamente
Fallos Losobjetosfallanconjuntamente
Laredpuedefallar
Accesoconcurrente Sloconmltiplesthreads Si
Seguro Si No
Lacomunicacinentreobjetosdeunmismoprocesoesvariosrdenesdemagnitudmsrpidaquelacomunicacinentreobjetos
endiferentesmquinas.Deestosedesprendequeustednodeberadisearaplicacionesdistribuidasenlascualesdosomsobjetos
distribuidosestnmuyntimamenterelacionados.Sihayesaestrecharelacin,dichosobjetosdeberansituarseenunmismolugaro
proceso.
Cuandodosobjetosestnlocalizadosconjuntamente,puedenfallaralavez.Sielprocesoquelosejecutafalla,ambosobjetos
fallarn.Eldiseadordebetenerencuentaestacaracterstica:siunobjetofalla,puedesaberqueelotroobjetotambinfallarsise
encuentranbajounmismoproceso,sinembargo,sielsistemaestdistribuidohabraquetenerencuentaquesiunobjetofalla,otro
objetopuedequenofalle.Estonosdaunatoleranciaafallossitenemoslosobjetosduplicadosporlared.Encasodequelared
falleenunpunto,losobjetosqueestnaambosladosdeesepuntoderupturapuedenseguirejecutndoseindependientemente
asumiendoquelosdelotroladohanfallado.
Elmodopordefectoparaprogramaraplicacioneslocalesesusarunslothreaddecontrol.Programarconunthreadesfcil.El
accesoalosobjetosessecuencialynohayquepreocuparseporaccesosconcurrentes.
Siusteddecideintroducirmltiplesthreadsdecontrolenunprogramalocal,debeconsiderarelordenenelqueseaccedealos
objetosyusarmecanismosdesincronizacinparacontrolarelaccesoconcurrentealosobjetoscompartidos.Peroporlomenos
tienelaposibilidaddeusarvariosthreads.Enaplicacionesdistribuidadhaynecesariamentemltiplesthreadsdecontrol.Cadaobjeto
distribuidooperaenunthreaddecontroldiferente.Unobjetodistribuidopuedetenermltiplesclientesconcurrentes.Como
desarrolladordeobjetosservidoresydeclientes,debeconsideraresteaccesoconcurrentealosobjetosyutilizarlosmecanismosde
sincronizacinnecesarios.
Cuandodosobjetosestnlocalizadoslocalmenteaunproceso,ustednonecesitatenerencuentalaseguridad.Sinembargo,cuando
losobjetosestnendiferentesmquinas,esnecesariousarmecanismosdeseguridadparaautentificarlaidentidaddelosotros
objetos.
1.3.SistemadeObjetosDistribuidos
Unsistemadeobjetosdistribuidosesunsistemadistribuidoenelquetodaslasentidadesestnmodeladascomoobjetos.Los
sistemasdeobjetosdistribuidossonunparadigmapopularparalasaplicacionesdistribuidasorientadasaobjeto.Dadoquela
aplicacinsemodelacomounconjuntodeobjetoscooperantes,semapeadeformanaturalalosserviciosdeunsistemadistribuido.
Teniendoencuentaelmapeonaturaldeunmodeloorientadoaobjetosasistemasdeobjetosdistribuidos,nohayqueolvidarlas
realidadesquesedanenlossistemasdistribuidos,comosedescribianteriormente.Loslmitesdelosprocesosimportanysedeben
tenerencuentaeneldiseo.
1.4.QuesCORBA?
CORBA(CommonObjectRequestBrokerArchitecture)esunaarquitecturaestandarparasistemasdeobjetossitribuidos.Permite
unacoleccindistribuidayheterogneadeobjetosqueinteroperanentres.
1.4.1.ElOMG
ElOMG(ObjectManagementGroup)eselresponsabledeladefinicindeCORBA.ElOMGesunconjuntodemsde700
compaasyorganizaciones,incluyendocasitodoslosmayoresvendedoresydesarrolladoresdetecnologasdeobjetosdistribuidos.
1.4.2.LaarquitecturaCORBA
CORBAdefineunaarqitecturaparaobjetosdistribuidos.ElparadigmabsicodeCORBAesquesehaceunapeticinparaobtener
unserviciodeunobjetodistribuido.TodolodemsdefinidoporelOMGestdescritoentrminosdeesteparadigmabsico.
Losserviciosqueproporcionaunobjetosondadosporsuinterfaz.LosinterfacessedefinenenelIDL(InterfaceDefinition
Language)delOMG.Losobjetosdistribuidosestnidentificadosporreferenciasaobjetos,lascualessedescribenmediantelos
interfacesIDL.
Lafiguradeabajomuestragrficamenteunapeticin.Unclientetieneunareferenciaaunobjetodistribuido.Larefenciaalobjeto
estdescritaporuninterface.Enlafigura,lareferenciaestsimbolizadaporelinterfaceRabbit.ElORB(ObjectRequestBroker),
entregalapeticinalobjetoydevuelveelresultadoalcliente.
1.4.3.ElORB
ElORBeselserviciodistribuidoqueimplementalapeticinalobjetoremoto.Localizaelobjetoremotoenlared,lecomunicala
peticin,esperaalosresultadosycuandoestndisponiblesselosdevuelvealcliente.
ElORBimplementatransparenciadelocalizacin.Seusaexactamenteelmismomecanismodepeticionestantoporelclientecomo
porelobjetoCORBA,sinimportardondeestlocalizado.Podratratarsedeunprocesoenelmismoordenadorqueelclienteo
estarsituadoaunosmetrosoinclusoalotroladodelplaneta.Elclientenonotarladiferencia.
ElORBimplementaindependenciadellenguajedeprogramacinparalaspeticiones.Elclientequelanzalapeticinsepuedeescribir
enunodelosdiferenteslenguajesqueaceptanobjetosCORBA.ElORBhacelasconversionesnecesariasentrelenguajesde
programacin.EstosenlacesconCORBAestndefinidosparaloslenguajesmspopulares.
1.4.4.CORBAcomounEstandarparaObjetosDistribuidos
UnodelosobjetivosdelaespecificacinCORBAesquelasimplementacionesdelosclientesyservidoresseanportables.La
especificacinCORBAdefineunAPI(ApplicationProgrammer'sInterface)paralosclientesdeobjetosdistribuidosascomoun
APIparalaimplementacindeunobjetoCORBA.EstosignificaqueelcdigoescritoporundesarolladorCORBApuede,conun
esfuerzomnimo,reescribirseparatrabajarconelproductodeotrodesarrollador.Sinembargo,larealidaddelosproductos
CORBAdelmercadodehoyesquelosclientesCORBAsonportables,perolasimplementacionesdelosobjetosnecesitanunpoco
deesfuerzoparaportarsedeunproductoCORBAaotro.
CORBA2.0aadilainteroperabilidadcomounobjetivoenlaespecificacin.Enparticular,CORBA2.0defineunprotocolode
redllamadoIIOP(InternetInterORBProtocol),quepermitealosclientesusarproductosCORBAdecualquierdesarrolladorque
secomuniquenconobjetosCORBAdecualquierotrodesarrollador.IIOPtrabajasobreInternet,omsexactamente,sobre
cualquierimplementacindeTCP/IP.
Lainteroperabilidadesmsimportanteenunsistemadistribuidoquelaportabilidad.IIOPseusaenotrossistemaqueinclusono
intentanproporcionarelAPIdeCORBA.Enparticular,IIOPseusarcomoprotocolodetransporteenunaversindeJavaRMI
(llamada"RMIoverIIOP").DadoqueEJBestdefinidoentrminosdeRMI,tambinpuedeusarIIOP.Variosservidoresde
aplicacionesdisponiblesenelmercadousanIIOP,peronoimplementanelAPIcompletodeCORBA.Dadoquetodosellosusan
IIOP,estoslosprogramaspuedeninteroperarconcualquierotroqueestescritoparaelAPIdeCORBA.
1.4.5.ServiciosCORBA
OtraparteimportantedelestandarCORBAesladefinicindeunconjuntodeserviciosdistribuidosparasoportarlaintegracine
interoperabilidaddelosobjetosdistribuidos.Comosemuestraenelgrficodeabajo,losservicios(conocidoscomoCORBA
ServicesoCOS)seencuentrandefinidosenlapartesuperiordelORB.Estoes,estndefinidoscomoobjetosCORBAestandar
coninterfacesIDL,algunasvecesllamados"ObjectServices."
ExistenvariosserviciosqueproporcionaCORBA.Losmspopularessedescribenbrevementeacontinuacin:
Servicio Descripcin
DefinecomolosobjetosCORBAsecrean,eliminan,
Ciclodevidadelobjeto
muevenycopian.
DefinecomolosobjetosCORBApuedentenernombres
Nominacin simblicosamigables.
Eventos Desacoplalacomunicacinentreobjetosdistribuidos.
Proporcionaunredarbitrariaderelacionesentreobjetos
Relaciones
CORBA.
CoordinalatransformacinentreobjetosCORBAay
Externalizacin
desdeelmedioextreno.
Transacciones CoordinaaccesosatmicosaobjetosCORBA.
Proporcionaunserviciodebloqueoparaobjetos
Controldeconcurrencia
CORBAqueaseguraaccesosserializables.
Soportalaasociacindeparesnombrevalorcon
Propiedad
objetosCORBA.
SoportalabsquedadeobjetosCORBAbasadosen
Negociacin propiedadesquedescribenelservicioofrecidopor
elobjeto.
Consultas Soportalasconsultasaobjetos.
1.4.6.ProductosCORBA
CORBAesunaespecificacinesunaguiaparaimprementarproductos.VarioscomerciantesproporcionanproductosCORBA
paravarioslenguajesdeprogramacin.LosproductosCORBAqueadmiteellenguajeJavaincluyen:
ORB Descripcin
VieneconelJava2SDKdeSun.Noimplementa
Java2ORB
algunasfuncionalidades.
UnORBparaJavamuypopulardeInpriseCorporation.
VisiBrokerforJava VisiBrokertambinlopodemosencontrarempotradoen
otrosproductos,comoenelNetscapeCommunicator.
OrbixWeb UnORBparaJavadeIonaTechnologies.
WebSphere UnservidordeaplicacionesconunORBdeIBM
ElNetscapetieneunaversindeVisiBrokerincrustada.
NetscapeCommunicator LosAppletspuedenhacerpeticionesaobjetosCORBA
sindescargarclasesORBenelnevegador.Yaestnah.
ExistenimplementacionesdeCORBAparavarioslenguajes
VariasORBslibresoshareware
quesepudendescargardealgunosservidores.
AcontinuacinveremoselprocesodedesarrollodeunaaplicacinCORBA.
2.ProcesodedesarrolloenJavaIDL
AhoraqueyahemosvistolarelacinentreelclienteyelservidorenCORBA,ustedestlistoparadarelgranpasohaciaelproceso
dediseoydesarrollodeobjetosdistribuidosconelJavaIDL.
2.1.DefinirelInterfazRemoto
UsteddefinelainterfazparaelobjetoremotousandoellenguajeparaladefinicindeinterfacesdelOMG.UsamosIDLenlugarde
Javaproqueelcompiladoridl2javaautomticamentegeneralosficherosdestubyskeletonenJavaapartirdeladefinicin
IDL,ascomotodalainfraestructuraparaconectarconelORB.Tambin,usandoIDL,ustedhaceposiblealosdesarrolladores
implementarclientesyservidoresencualquierotrolenguajecompatibleconCORBA.
NtesequesiustedestimplementandounclienteparaunservicioexistentedeCORBA,ounservidorparaunclienteyaexistente,
usteddeberacogerlosinterfacesIDLdelimplementador.Deberejecutarelcompiladoridl2javapasandocomoparmetroesos
interfaceseimplementarlosmtodosquenecesite.
2.2.CompilarelInterfazRemoto
CuandoustedejecutaelcompiladorIDLdeaJava(idl2java)conladefinicindelinterface,generaunaversinenJavadel
interface,ascomoelcdigodelasclasesdelosficherosdestubyskeletonquelepermitenengancharsuaplicacinalORB.
EstassonlosmapeosquesehacenentreconstructoresdeIDL,JavayC++:
YesteeselmapeoparalostiposdedatosentreIDLyJava:
IDL Java
boolean boolean
char/wchar char
octet byte
short/unsignedshort short
long/unsignedlong int
longlong/unsignedlonglong long
float float
double double
string/wstring String
2.3.ImplementarelServidor
Unavezejecutadoelcompiladoridl2java,ustedpuedeusarelesqueleto(skeleton)generadoparaimplementarlaaplicacin
servidora.Ademsdeimplementarlosmtodosdelinterfaceremoto,sucdigodelservidorincluyeunmecanismoparainicarel
ORByesperarunapeticindeunclienteremoto.
2.4.ImplementarelCliente
Deformasimilar,ustedusarlosstubsgeneradosporelcompiladoridl2javacomobaseparalaaplicacincliente.Elcdigodel
clienteiniciasuORB,buscaelservidorusandoelserviciodenombradoproporcionadoconJavaIDL,obtieneunareferenciaal
objetoremotoyllamaasumtodo.
2.5.Iniciarlasaplicaciones
Unavezqueestimplementadoelclienteyelservidor,ustedpuedeiniciarelserviciodenombrado,iniciarelservidoryporltimo
arrancarelcliente.
Unavezquesabemoslateora,pasemosacreaunejemploprctico.
3.Ejemplo"Helloworld"enCliente/Servidor
Construiremoseltpicoprogramadeejemploqueimprimelacadena"Hello world!!",peroenversincliente/servidorcon
CORBA.SetratardeunaaplicacindistribuidausandoelJavaIDL.Elprogramatieneunaslooperacinquedevuelveuna
cadena,lacualimprimir.Todoslosfundamentostericosquenecesitamosparacomprenderelejemployahansidoexpuestos
previamente.Estediagramamuestraelprocesodecomunicacinentreelclienteyelservidor,atravsdelIIOP:
Estossonlospasosquesellevaacabo:
1. ElclienteinvocalaoperacinsayHellodelservidorHelloServer.
2. ElORBtransfieredichainvocacinalobjetoservidorregistradoparaelinterfaceIDL.
3. ElmtodosayHellodelservidorseejecuta,devolviendounString.
4. ElORBtransfiereeseStringdevueltaalcliente.
5. ElclienteimprimeelvalordelStringobtenido.
Aunquetengaundiseomuysimple,esteprogramadeejemplolepermiteaprenderyexperimentarcontodaslastareasquese
requierenparadesarrollarcasicualquierprogramaenCORBAqueuseinvocacinesttica.
AntesdeempezaratrabajarconJavaIDL,ustednecesitadoscosas:laversin1.2delJDKyelcompiladoridl2java(de
VisiBrokerforJava).ElJDKproporcionaelAPIyelORBnecesariosparahabilitarlainteraccinentrelosobjetosdistribuidos
basadoenCORBA.Elcompiladoridl2javausaelmapeoIDL>JavaparaconvertirlasdefinicionesdeinterfacesescritasenIDL
alosinterfaces,clasesymtodoscorrespondientesenJava,queusaremosparaimplementarelcdigodelclienteydelservidor.
Estossonlospasos:
EscribirelinterfazIDL
EscribirelCliente
EscribirelServidor
CompilaryEjecutarlaaplicacin
4.EscribirelinterfazIDL
EnestaseccinescribiremosuninterfazIDLsimpleparaelprogramaHello World.ElinterfaceIDLdefineelcontratoentrelas
partesclienteyservidordesuaplicacin,especificandoquoperacionesyatributosestndisponibles.OMGIDLesindependiente
dellenguajedeprogramacin.UsteddebemapearloaJavaantesdeescribirelcdigoqueimplementelosservicios(elprograma
idl2javalohacedeformaautomtica).
4.1.EscribiendoHello.idl
OMGIDLesunlenguajepuramentedeclarativodiseadoparaespecificarinterfacesparaaplicacionesdistribuidasdeunaforma
independientedellenguaje.OMGespecificaunmapeodeIDLavarioslenguajesdeprogramacin,incluyendoC,C++,Smalltalk,
COBOL,AdayJava.Cuandosemapea,cadaordenenOMGIDLsetraduceasucorrespondienteordenenellenguajede
programacinelegido.Ustedpuedeusarlaherramientaidl2javaparamapearuninterfazenIDLaJavaeimplementarlaclasedel
cliente.CuandoustedmapeaelmismoIDLsobreC++eimplementaelservidoreneselenguaje,elclienteenJavayelservidoren
C++puedencomunicarseatravsdelORBcomosiestuvieranescritosenelmismolenguaje.
ElIDLparaHelloWorldesextremadamentesimplesunicointerfacetieneunanicaoperacin.Ustednecesitarealizarslolostres
pasosquesedescribenabajo:
4.1.1.DeclararelMduloIDLdeCORBA
UnmdulodeCORBAesunespaciodenombrequeactacomouncontenedorparalosinterfacesydeclaracionesasociados.Se
correspondeaunpaquetedeJava.CadamduloenunficheroIDLsemapeaaunpaquetedeJava.
LadeclaracindelmduloHelloAppsehaceas:
module HelloApp {
// Las dems lneas van aqu.
};
4.1.2.DeclararlaInterface
AscomolosinterfacesenJava,losinterfacesdeCORBAdeclaranelAPIqueusanlosobjetosparallamarseunosaotros.Cada
interfaceenIDLsemapeaconuninterfaceenJava.
EscribiremosenelficheroHello.idlelinterfaceHello:
module HelloApp {
interface Hello {
// Aqu irn las operaciones.
};
};
4.1.3.DeclarandolasOperaciones
LasoperacionesdeCORBAtienenelcomportamientoqueprometenlosservidoresrealizarcuandolosclienteslosinvocan.Este
compromisovieneindicadoenelIDL.CadasentenciadeoperacinenIDLgenerasucorrespondientesentenciademtodoenel
interfazgeneradodeJava.
IntroducimoslaoperacinenelficheroHello.idl:
module HelloApp {
interface Hello {
string sayHello(); // Aadimos esta lnea.
};
};
4.2.MapeandoHello.idldeIDLaJava
Laherramientaidl2javaleelosficherosOMGIDLycrealosficherosJavanecesarios.Pordefecto,elcomportamientodela
herramientaesgenerartantoelclientecomoelservidor(talcomonecesitamosparanuestroejemplo),simplementelepasamoscomo
parmentroelficheroIDLquehemoscreadoantes:
$ idl2java Hello.idl
Siustedlistaelcontenidodeldirectorio,verquesehacreadoundirectoriollamadoHelloApp,elcualcontienecincoficheros.El
contenidodelficheroHello.javaessimilaraesto:
Conelinterfacetansimplequetenemos,esfcilcomprobarcmosehahechoelmapeoparagenerarelcdigoJavaapartirdel
IDL:
SentenciaIDL SentenciaJava
moduleHelloApp packageHelloApp
interfaceHello publicinterfaceHello
stringsayHello() StringsayHello()
Lanicasorpresaeslasentenciaextends.TodoslosobjetosCORBAderivandeorg.omg.CORBA.Objectparaasegurarseque
setienetodalafuncionalidadCORBA.
4.3.Comprendientolasalidadeidl2java
Elcompiladoridl2javageneraunaseriedeficheros,basndoseenlasopcionesquelepasamosenlalneadecomnados.Dado
queproporcionaunafuncionalidadpordefecto,ustedpuedeignorarestasopcionesporahora.Loscincoficherogeneradosson:
4.3.1._HelloImplBase.java
Estaclaseabstractaeselskeletondelservidor,proporcionandounafuncionalidadCORBAbsicaparaelservidor.Implementael
interfaceHello.java.LaclasedelservidorHelloServantheredade_HelloImplBase.
/*
* File: ./HelloApp/_HelloImplBase.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Jul 12 1997 12:23:47
*/
package HelloApp;
public abstract class _HelloImplBase extends org.omg.CORBA.DynamicImplementation
implements HelloApp.Hello {
// Constructor
public _HelloImplBase() {
super();
}
// Type strings for this class and its superclases
private static final String _type_ids[] = {
"IDL:HelloApp/Hello:1.0"
};
org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
}
}
}
4.3.2._HelloStub.java
Estaclaseeselstubdelcliente,proporcionandofuncionalidadCORBAalcliente.ImplementaelinterfaceHello.java.
/*
* File: ./HelloApp/_HelloStub.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/
package HelloApp;
public class _HelloStub
extends org.omg.CORBA.portable.ObjectImpl
implements HelloApp.Hello {
public _HelloStub(org.omg.CORBA.portable.Delegate d) {
super();
_set_delegate(d);
}
// IDL operations
// Implementation of ::HelloApp::Hello::sayHello
public String sayHello() {
org.omg.CORBA.Request r = _request("sayHello");
r.set_return_type(org.omg.CORBA.ORB.init().get_primitive_tc(
org.omg.CORBA.TCKind.tk_string));
r.invoke();
String __result;
__result = r.return_value().extract_string();
return __result;
}
};
4.3.3.Hello.java
EsteinterfacecontienelaversinenJavadelinterfaceenIDL.ContieneunslomtodollamadosayHello.Elinterface
Hello.javaheredadeorg.omg.CORBA.Object,proporcionandotambinunafuncionalidadCORBAestndar.
/*
* File: ./HelloApp/Hello.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/
package HelloApp;
public interface Hello
extends org.omg.CORBA.Object {
String sayHello();
}
4.3.4.HelloHelper.java
Estaltimaclaseproporcionaunafuncionalidadauxiliar,msquenadaelpequeomtodonecesarioparahacerlaconversindela
referenciaalobjetoCORBAasustiposadecuados.
/*
* File: ./HelloApp/HelloHelper.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/
package HelloApp;
public class HelloHelper {
// It is useless to have instances of this class
private HelloHelper() { }
4.3.5.HelloHolder.java
EstaltimaclasecontieneunmiembrodeinstanciapblicadeltipoHello.Proporcionalasoperacionesparatrabajarconlos
argumentosquetieneCORBAparenosepuedenmapearfcilmenteenlasemnticadeJava:
/*
* File: ./HelloApp/HelloHolder.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/
package HelloApp;
public final class HelloHolder
implements org.omg.CORBA.portable.Streamable{
// instance variable
public HelloApp.Hello value;
// constructors
public HelloHolder() {
this(null);
}
public HelloHolder(HelloApp.Hello __arg) {
value = __arg;
}
CuandoustedescribeuninterfaceIDL,ustedyahacetodoeltrabajoparagenerartodosestosficherosnecesariosparasu
aplicacindistribuida.Elnicotrabajoadicionalquedebehaceresimplementarlafuncionalidaddelclienteydelservidor.Estoeslo
queveremosenlossiguientescaptulos.
5.DesarrollodelCliente
EnestaseccinveremoscomodarunafuncionalidadaunaaplicacinclienteenCORBA.
5.1.Realizarunaconfiguracinbsica
ElcascarnbsicodeunclienteCORBAeselmismoquemuchasaplicacionesJava:seimportanlospaquetesrequeridos,
declaramoslaclasedelaaplicacin,definimoselmtodomainyprocuramosmanejarcualquierexcepcin.
5.1.1.Importandolospaquetesrequeridos
VamosacrearunnuevoficherollamadoHelloClient.javaeneldirectoriodelproyecto.Importaremoslospaquetesnecesarios:
5.1.2.Declarandolaclasedelcliente
EnelficheroHelloClient.java,declaramoslaclasedelcliente:
5.1.3.Definiendoelmtodomain
CadaaplicacinJavanecesitaunmtodomain.DeclremosdentrodelaclaseHelloClient:
5.1.4.ManejandolasexcepcionesCORBA
DadoquetodoslosprogramasCORBApuedenlanzarexcepcionesdelsistemaCORBAentiempodeejecucin,usteddebe
englobartodalafuncionalidadprincipaldentrodeunbloquetry-catch.LosprogramasCORBAlanzanexcepcionessiempreque
ocurreunproblemadurantealgunodelosprocesosinvolucradosenlainvocacindelservidorporpartedelcliente.
Nuestromanejadordeexcepcionessimplementeimprimeelnombredelaexcepcinylatrazadelapilaporlasalidaestandar,as
podrverqucosashanidomal.
Dentrodelmain,pondremoselbloquetry-catch:
try {
// Aada el resto del cdigo del cliente aqu.
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
5.2.CrearunobjetoORB
UnclienteCORBAnecesitaunobjetoORBlocalpararealizartodoeltrabajodeconversindedatosycomunicacin.Cadacliente
instanciaunobjetoorg.omg.CORBA.ORByloinicializapasndoleciertainformacinsobresmismo.
EnelficheroHelloClient.java,dentrodelbloquetry-catch,declaramoseinicializamosunavariableORB:
LallamadaalmtodoinitdelORBlepasalosargumentosdelalneadecomando,permitindoleestablecerciertaspropiedades
entiempodeejecucin.
5.3.EncontrarelServidorHello
UnavezquelaaplicacintieneunORB,puedepreguntaralORBparalocalizarelservicioquenecesita,queennuestrocasoesel
servidorHello.UnclienteCORBAtienevariasformasdeobtenerunareferenciainicialnuestraaplicacinclienteusarelCOS
Naming ServiceespecificadoporOMGyproporcionadoporJavaIDL.
5.3.1.ObtenerelContextoInicialdeNombrado
ElprimerpasoquehayquedarparausarelServiciodeNombrado(NamingService)esobtenerelcontextoinicialdenombrado.En
elbloquetry-catch,bajolainicializacindelORB,llamaremosaorb.resolve_initial_referencesparaobteneruna
referenciaaunobjetodelservidordenombres:
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
Lacadena"NameService"estdefinidaparatodoslosORBsdeCORBA.Cuandoustedpasaesacadena,elORBdevuelveel
contextoinicialdenombrado,unareferenciaaunobjetodelservidordenombres.
5.3.2.AjustarlaReferenciaaObjeto
ComocontodoslasreferenciasaobjetosCORBA,objRefesunobjetoCORBAgenrico.Parausarlocomounobjeto
NamingContext(ContextodeNombrado),usteddebeajustarloasutipoadecuado.Aadalallamadaparaajustarlodebajodela
sentenciaanterior:
Aquvemoselusodeunaclasedeayudageneradaporidl2java,similarensufuncinaHelloHelper.ElobjetoncRefesahora
deltipoorg.omg.CosNaming.NamingContextyustedpuedeusarloparaaccederalserviciodenombradoyencontrarotros
servicios.Esoloharemosenelsiguientepaso.
5.3.3.EncontrarunServiciodeNombrado
Losnombrespuedentenerdiferentesestructurasdependiendodelaimplementacindelserviciodenombrado.Consecuentemente,
losservidoresdenombresdeCORBAmanejannombrescomplejosenformadeobjetosNameComponent.CadaNameComponent
tieneunasolaparte,oelemento,delnombre.UnvectordeobjetosNameComponentpuedenalbergaruncaminoaunobjeto
completamenteespecificado,yaseaenunficherooenundiscodelsistema.
ParaencontrarelservidorHello,ustednecesitaunNameComponentparaalmacenarunacadenaidentificativaparaelservidor
Hello.Aadaestecdigodirectamentedebajodelallamadadeajuste:
Estainstruccinestableceelcampodeidentificacindenc,elnuevoNameComponent,a"Hello"yelcampodetipoaunacadea
vaca.
DadoqueelcaminoalobjetoHellotieneslounelemento,crearemosunvectordeunsloelementodenc.Elmtodo
NamingContext.resolvenecesitaestevectorparasutrabajo:
Finalmente,pasamoselcaminoalmtododeresolucindelserviciodenombresparaobtenerunareferenciaalservidorHelloy
ajustarloaunobjetoHello:
AqupodemosverlaclasedeayudaHelloHelpertrabajando.ElmtododeresolucindevuelveunobjetoCORBAgenrico
comoustedviomsarribacuandolocalizbamoselserviciodenombrado.Portanto,ustedloajustaaunobjetoHello,queesel
objetoreferenciadoquenecesitamosparaefectuarelrestodeltrabajo.
5.4.InvocandolaOperacinsayHello
LasinvocacionesenCORBAseparecenaunallamadaaunobjetolocal.Lascomplicacionesdeajustedetiposdedatos
(marshalingyunmarshaling),ruteoydemssoncompletamentetransparentesalprogramadordelcliente.Dadoqueyahaymucho
hechoporelcdigogenerado,lainvocacinesrealmentelapartemsfcildelaprogramacinenCORBA.
Continuandoenelcloquetry-catchdelficheroHelloClient.java,introduzcalasiguienteinvocacindebajodelaresolucin
delnombredelservicio:
Finalmente,aadacdigoparaimprimirelresultadodelainvocacinalasalidaestandar:
System.out.println(hello);
ElficheroHelloClient.javacompletoeselsiguiente:
Ahorayapuedeescribirelcdigodelservidor.
6.DesarrollodelServidor
AhoranostocaimplementarelservidorHelloServer.java.
6.1.Realizandounaconfiguracinbsica
LaestructuradeunprogramaservidorenCORBAeslamismaquelademuchasaplicacionesenJava:ustedimportalospaquetes
necesarios,declaralaclaseservidora,defineelmtodomainymanejacualquierexcepcinqueocurra.
6.1.1.Importandolospaquetesrequeridos
CrearemosunficherollamadoHelloServer.java.Luegoimportaremoslospaquetesnecesariosparaestaclase:
6.1.2.Declarandolaclasedelservidor
Declaramoslaclasedelservidor:
6.1.3.Definiendoelmtodomain
Declaramosunmtodomainestndar:
6.1.4.ManejandolasexcepcionesCORBA
DadoquetodoprogramaCORBApuedelanzarexcepcionesentiempodeejecucin,usteddebeponertodalafuncionalidad
principaldentrodeunbloquetry-catch.LosprogramasCORBAlanzanexcepcionesentiempodeejecucincuandoocurrealgn
problemadurantealgunodelosprocesosquesellevanacabodurantelainvocacindeservicioremoto(marshaling,unmarshaling,
upcall).Elmanejadordeexcepcionessimplementeimprimelaexcepcinylatrazadelapila.Deestaformapodremossaberqu
cosahaidomal.
Dentrodelbloquetry-catchescribiremos:
try {
// Aada el resto del cdigo del servidor aqu.
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
6.2.CrearunobjetoORB
Comouncliente,unservidorCORBAtambinnecesitaunobjetoORBlocal.CadaservidorinstanciaunORByregistasusobjetos
sirvientesparaqueelORBpuedaencontrarelseridorcuandorecibeunapeticinparal.
EnelficheroHelloServer.java,dentrodelbloquetry-catch,declaramoseinicializamoslavariableORB:
LallamadaalmtodoinitdelORBlepasalosargumentosdelalneadecomando,permitindoleestablecerciertaspropiedadesen
tiempodeejecucin.
6.3.AdministrandoelObjetoSirviente
Unservidoresunprocesoqueinstanciaunoovariosobjetossirvientes.Elsirvienteimplementalainterfacegeneradaporelprograma
idl2javayrealizaeltrabajodelinterface.NuestroHelloServernecesitaunHelloServant.
6.3.1.InstanciandoelObjetoSirviente
Dentrodelbloquetry-catch,justodebajodelallamadaainit,instanciaremoselobjetosirviente:
Estaclasesirvientenoestdefinidaanloharemosenelsiguientepaso.SeguidamenteconectaremoselsirvientealORB,paraque
elORBpuedareconocerlasllamadasasteyenviarlasalsirvientecorrecto:
orb.connect(helloRef);
6.3.2.DefiniendolaClaseSirviente
AlfinaldeHelloServer.java,fueradelaclaseHelloServer,definalaclaseparaelobjetosirviente.Paraellodeclaramosla
clase:
Elsirvienteesunasubclasede_HelloImplBaseasqueheredalafuncionalidadgeneralCORBAgeneradaporelcompilador.
DeclareelmtodosayHello:
Yescribimoslaimplementacindelmtodo:
ElficheroHelloServer.javacompletoeselsiguiente:
6.4.TrabajandoconelNombramientoCOS
ElservidorHelloServertrabajaconelserviciodenombramientoparahacerdisponibleslasoperacionesdelsirvientealosclientes.
Elservidornecesitaunareferenciaalnombredelservicio,demaneraquepuedaregistrarloyasegurarsequelaspeticionesdel
interfaceHellosondirigidasasuobjetosirviente.
6.4.1.ObteniendoelContextoInicialdeNombramiento
Enelbloquetry-catch,bajolainstanciacindelsirviente,llamaremosaorb.resolve_initial_referencesparaobteneruna
referenciaalserviciodenombres:
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
LacadenaNameServiceestdefinidaparatodoslosORBsdeCORBA.Cuandoustedpasaesacadena,elORBdevuelveun
contextodenombramientoqueesunareferenciaalserviciodenombres.
6.4.2.AjustandolaReferenciaaObjeto
ComocontodoslasreferenciasaobjetosCORBA,objRefesunobjetoCORBAgenrico.Parausarlocomounobjeto
NamingContext(ContextodeNombrado),usteddebeajustarloasutipoadecuado.Aadalallamadaparaajustarlojustamente
debajodelasentenciaanterior:
NamingContext ncRef = NamingContextHelper.narrow(objRef);
Aquvemoselusodeunaclasedeayudageneradaporidl2java,similarensufuncinaHelloHelper.ElobjetoncRefesahora
del
tipoorg.omg.CosNaming.NamingContextyustedpuedeusarloparaaccederalserviciodenombradoyencontrarotros
servicios.
Esoloharemosenelsiguientepaso.
6.4.3.RegistrarelSirvienteenelServidordeNombres
Justodebajodellamadaalajuste,creeunnuevomiembroNameComponent:
Estainstruccinestableceelcampodeidentificacindenc,elnuevoNameComponent,a"Hello"yelcampodetipoaunacadea
vaca.DadoqueelcaminoalobjetoHellotieneslounelemento,crearemosunvectordeunsloelementodenc.Elmtodo
NamingContext.resolvenecesitaestevectorparasutrabajo:
Finalmente,pasamoselcaminoyelobjetosirvientealserviciodenombramiento,ligandoelobjetosirvientealidentificador"Hello":
ncRef.rebind(path, helloRef);
Ahora,cuandoelclientellamaaresolve("Hello")enelcontextoinicialdenombramiento,elserviciodenombramientodevuelve
unreferenciaalobjetosirvienteHello.
6.5.Esperandoalapeticin
Elservidorestpreparadosimplementenecesitaesperaraunapeticindelcliente.Parahaceresto,introduzcaelsiguientecdigoal
finaldelbloquetry-catch:
EstaformadeObject.waithacequeHelloServerpermanezcavivo(aunqueincativo)hastaquevengaunapeticindelORB.
Comoestoestenelmain,depusdequesecompleteysayHellotermine,elservidoresperarotravez.
Unavezquetenemostodoescrito,pasemosacompilarloyprobarlo.
7.Compilandoyejecutandolaaplicacin"HelloWorld"
Estaseccinmuestracomocompilaryejecutartantoelservidorcomoelclientequeconjuntamenteformanlaaplicacin"Hello
World".
7.1.CompilandoelCliente
CompilamoselficheroHelloClient.java:
DeberaaparecerelficheroHelloClient.classeneldirectoriodelproyecto.
7.2.CompilandoelServidor
CompilamoselficheroHelloServer.java:
DeberanaparecerlosficherosHelloServer.classyHelloServant.class.
7.3.EjecutandolaAplicacinCliente/Servidor
Desdeunaterminal,iniciamoselservidordenombresdeJavaIDL:
Ntesequenameserverporteselpuertodondecorrerelservidordenombres.Siustednoespecificaestepuerto,pordefectose
elegirel900.SiestamosenUnixhayquetenerencuentaqueslorootpuedeejecutarunprocesoenunpuertomenorque1024.
Porestarazn,recomendamosqueseelijaunpuertosuperiora1024.
DesdeunasegunaterminaliniciamoselservidordeHello:
NtesequenameserverhosteselhostdondeelservidordenombresIDLestejecutndose.Ustedpuedeomitir-
ORBInitialHost nameserverhostsielservidordenombresestejecutndoseenlamismamquinaqueelservidordeHello.
Tambinpuedeomitir-ORBInitialPort nameserverportsielservidordenombresseestejecutandoenelpuertoasignado
pordefecto.
DesdeunaterceraterminalejecutamoselclientedeHello:
NtesequenameserverhosteselhostdondeelservidordenombresIDLestejecutndose.Ustedpuedeomitir-
ORBInitialHost nameserverhostsielservidordenombresestejecutndoseenlamismamquinaqueelclientedeHello.
Tambinpuedeomitir-ORBInitialPort nameserverportsielservidordenombresseestejecutandoenelpuertoasignado
pordefecto.
Elclienteimprimelacadenaqueleenvaelservidor:
Hello world!!
RecuerdeparartantoelprocesotnameservcomoHelloServerdespusdequeelclienteterminesatisfactoriamente.
Bien,yaesustedunexpertoenprogramacinCORBAenlenguajeJava.Ahoradebeprobartodascosasqueseleocurra,
complicandoesteejemploinicial.Suerte!!!