Programu rahisi ya CORBA - fanya mwenyewe. Teknolojia ya CORBA (Usanifu wa Wakala wa Ombi la Kawaida).

Jifahamishe na nyenzo za kinadharia zilizowasilishwa katika viambatisho vya miongozo hii na programu za sampuli. Soma maandishi ya kazi kazi ya maabara, pendekeza uwekaji wa sehemu na utendaji ili kukidhi mahitaji ya mgawo wa maabara, na uandike mpango.

2. Kazi ya maabara

Kuendeleza mteja wa barua na seva. Mteja - programu ya dirisha, ambayo itakuruhusu kutuma na kupokea ujumbe kutoka kwa seva. Utambulisho wa wateja kwenye seva, itifaki ya uhamishaji ujumbe iko kwa hiari ya wanafunzi.

Seva inaweza kuwa programu ya console. Unaweza kuhifadhi ujumbe katika faili ya maandishi. Inashauriwa kufanya seva iwe na nyuzi nyingi.

Ili kuingiliana kati ya mteja na seva, tumia teknolojia ya CORBA.

Kama nyongeza, inapendekezwa kutekeleza seva au mteja sio kwenye Java.

3. Yaliyomo kwenye ripoti

Ripoti lazima iwe na:

1. Taarifa ya tatizo kutatuliwa na mpango kazi vizuri.

2. Mwongozo wa mtumiaji wa programu iliyotatuliwa, iliyo na maelezo ya miingiliano ya kazi zote za programu.

3. Kuorodhesha programu na maoni muhimu.

4. Maswali ya kudhibiti

1. CORBA ni nini?

2. IDL ni nini? Ni ya nini?

3. Je, mteja na seva huingiliana vipi katika CORBA?

4. Data huhamishwaje kati yao?

5. Seva ya jina ni ya nini?

6. Je, unawezaje kuanzisha seva ya CORBA?

5. Fasihi

1. Ken Arnold, James Gosling, David Holmes. Lugha ya programu ya Java™.

2. Tovuti rasmi ya Java - http://java.sun.com/ (kuna sehemu katika Kirusi yenye kitabu cha maandishi).

3. Java™ 2 SDK, Toleo la Kawaida Hati - http://java.sun.com/products/jdk/1.5/index.html.

4. James Gosling, Bill Joy, Guy Steele. Vipimo Lugha ya Java(Ainisho ya Lugha ya Java - http://www.javasoft.com/docs/books/jls/). Tafsiri kwa Kirusi - http://www.uni-vologda.ac.ru/java/jls/index.html

5. Tovuti rasmi ya mradi wa Eclipse ni http://www.eclipse.org/.

6. Kiambatisho cha 1. CORBA

Teknolojia ya CORBA( Usanifu wa Dalali wa Ombi la Kawaida) ni kiwango cha uandishi maombi yaliyosambazwa, iliyopendekezwa na muungano wa OMG (Open Management Group). Kwa kuunda vitu vya CORBA, tunaweza, kwa mfano, kupunguza kwa kiasi kikubwa muda unaohitajika kutatua matatizo ambayo yanahitaji kiasi kikubwa cha hesabu. Hili linawezekana kwa kuwasha vitu vya CORBA magari tofauti. Kila kitu cha mbali hutatua kazi ndogo maalum, na hivyo kumwondolea mteja kazi isiyo ya lazima.

Msingi wa CORBA ni Dalali wa Ombi la Kitu. ORB inasimamia mwingiliano wa vitu katika mazingira ya mtandao iliyosambazwa. IIOP (Itifaki ya Mtandao wa Inter-ORB) ni itifaki maalum ya mwingiliano kati ya ORB.

Kitu maalum kinachoitwa stub hufanya kazi katika nafasi ya anwani ya mteja. Baada ya kupokea ombi kutoka kwa mteja, hupakia vigezo vya ombi katika muundo maalum na kupeleka kwa seva, au tuseme kwa mifupa.

Mifupa ni kitu kinachofanya kazi katika nafasi ya anwani ya seva. Baada ya kupokea ombi kutoka kwa mteja, huifungua na kuituma kwa seva. Mifupa pia hubadilisha majibu ya seva na kuyapitisha kwa mteja (stub).

Kuandika programu yoyote ya CORBA kwa kutumia Teknolojia ya Java, unahitaji kuwa na mambo mawili - hii kifurushi kilichowekwa JDK1.5 na mkusanyaji wa idlj (...\jdk1.5.0\bin\idlj.exe). JDK hutoa seti ya madarasa ya kufanya kazi na vitu vya CORBA, na idlj hupanga lugha ya IDL hadi Java.

6.1 Kuunda programu rahisi ya CORBA

6.1.1 Kuandika kiolesura

Kuunda programu ya CORBA katika Java huanza kwa kuandika kiolesura cha kitu cha mbali kwa kutumia Lugha ya Ufafanuzi wa Kiolesura (IDL).

Hebu tuunde faili ya hello.idl

Module HelloApp(interface Hello(string sayHello(); utupu wa njia moja (););

Kiolesura hiki kinaelezea njia mbili tu, kuzima na semaHujambo. Zaidi ya hayo, haijalishi kwetu njia hizi zinafanya nini, jambo kuu ni kwamba tunaamua kuwa zipo na kuamua ni vigezo gani vya pembejeo na pato wanazo.

idlj – kuanguka Hello.idl

Imeonekana kwenye saraka ya sasa folder mpya Habari Programu, ambayo ina faili sita za java. Kila mmoja wao ana madhumuni yake mwenyewe.

· HelloPOA.java java ni darasa la dhahania ambalo si chochote zaidi ya kiunzi cha seva (mifupa) na hutoa utendaji wa seva.

· _HelloStub.java - darasa linalotumia mbegu za mteja. Hutoa utendaji wa mteja.

HelloHelper.java na HelloHolder.java ni madarasa ambayo hutoa kazi za sekondari kwa vitu vya CORBA.

· HelloOperations.java – darasa lililo na maelezo ya kiolesura cha hujambo katika Java.

· Hello.java – darasa ambalo ni mrithi wa HelloOperations, linalosaidia kiolesura cha org.omg.CORBA. Kitu.

6.1.2 Kuunda seva

Sasa kazi yetu ni kuandika darasa linalotumia kiolesura habari. Kwa upande wetu itakuwa HabariImpl. Tafadhali kumbuka kuwa ni mrithi wa darasa HabariPOA. KATIKA HabariImpl mbinu zilizotangazwa ndani Habari . idl .

Ili kurahisisha kazi, tamko la mbinu linaweza kuchukuliwa kutoka kwa faili HelloOperesheni . java , imetengenezwa jdlj .

Class HelloImpl huongeza HelloPOA (ya faragha ORB orb; public void setORB (ORB orb_val) (orb = orb_val;) // tekeleza sayHello() methodpublic String sayHello() (rudi "\nHujambo ulimwengu!!\n";) // tekeleza shutdown() methodpublic utupu shutdown() (orb .zima (sivyo);))

Hatua inayofuata ni kuunda upande halisi wa seva ya programu. Hili litakuwa darasa la HelloServer.

Itakuwa na njia moja tu - kazi kuu ya kawaida.

Jambo la kwanza tunalofanya ni kuunda ORB. Kisha tunaunda mfano wa darasa la kitu cha mbali (HelloImpl) na kusajili kwenye ORB. Ifuatayo tunaita huduma maalum majina (NameService) na uandikishe jina la kitu cha mbali ndani yake ili mteja aweze kuipata.

Hebu tuangalie kwa makini hatua hizi.

1. Uundaji na uanzishaji wa ORB. Imetolewa kwa kupiga simu mbinu tuli ndani yake darasa la ORB

2. Kuunda mfano wa darasa la kitu cha mbali na kusajili katika ORB

helloImpl.setORB(orb);

3. Kupata muktadha wa kumtaja (NamingContext)

org.omg.CORBA. Object objRef = orb.resolve_initial_references("NameService");

Katika mstari wa kwanza tunapata rejeleo la kitu kwa huduma ya jina (NameService). Lakini kwa kweli hiki ni kitu cha kawaida cha CORBA na ili kuitumia kama muktadha wa kumtaja (NamingContext), unahitaji kupiga njia hiyo. nyembamba darasa NamingContextHelper, ambayo inaonekana kubainisha kipengee hiki cha CORBA.

4. Kusajili jina la kitu cha mbali (HelloImpl)

Jina la kamba = "Habari";

ncRef.rebind(njia, href);

Jina limesajiliwa ili mteja apate kitu cha mbali. Chaguo za kubandika tena (NameComponent nc, Object obj) za kiolesura cha NamingContext hutekeleza kusudi hili.

5. Kusubiri maombi kutoka kwa mteja

Seva sasa iko tayari kutumika.

// HelloServer.javaiimport HelloApp.*;agiza org.omg. CosNaming.*;import org.omg. CosNaming. NamingContextPackage.*;import org.omg.CORBA.*;import org.omg. PortableServer.*;leta org.omg. PortableServer.POA;leta java.util. Properties;class HelloImpl huongeza HelloPOA (private ORB orb;public void setORB (ORB orb_val) (orb = orb_val;) // tekeleza sayHello() methodpublic String sayHello() (rudi "\nHujambo ulimwengu!!\n";) // tekeleza shutdown() methodpublic void shutdown() (orb.shutdown(false);))

darasa la umma HelloServer (

utupu tuli wa umma (String args) (

// unda na uanzishe ORB

ORB orb = ORB.init(args, null);

// pata marejeleo ya rootpoa na uwashe POAMAnager

POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

rootpoa.the_POAMmanager().amilisha();

// unda mtumishi na uisajili na ORB

HelloImpl helloImpl = HelloImpl mpya ();

helloImpl.setORB(orb);

// pata kumbukumbu ya kitu kutoka kwa mtumishi

org.omg.CORBA. Ref ya kitu = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.finyu(ref);

// pata muktadha wa kumtaja mzizi

// NameService inaomba huduma ya jina

org.omg.CORBA. Object objRef =

orb.resolve_initial_references("NameService");

// Tumia NamingContextExt ambayo ni sehemu ya Interoperable

// Uainishaji wa Huduma ya Kutaja (INS).

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// funga Rejeleo la Kitu katika Kutaja

Jina la kamba = "Habari";

Njia ya Kipengele cha Jina = ncRef.to_name(jina);

ncRef.rebind(njia, href);

System.out.println("HelloServer iko tayari na inasubiri...");

// subiri maombi kutoka kwa wateja

kukamata (Isipokuwa e) (

System.err.println("ERROR:" + e);

e.printStackTrace(System.out);

System.out.println("HelloServer Inatoka...");

6.1.3 Kuunda mteja

Wacha tuendelee kuandika nambari ya mteja.

Hatua za Msingi za Kuandika maombi ya mteja

1. Uundaji na uanzishaji wa ORB

2. Kupata muktadha wa huduma ya kumtaja (NamingContext)

3. Kutafuta kitu cha mbali

4. Kupiga simu kwa njia ya sayHello.

5. Kuita njia ya kuzima.

Kama unaweza kuona, vidokezo viwili vya kwanza vinaambatana na hatua za kuunda programu ya seva, kwa hivyo hatutazingatia.

Hoja ya tatu pia ni rahisi sana kutekeleza. Kipengee cha NameComponent kimeundwa. Njia ya kutatua(NameComponent) inaitwa, ambayo hupata kitu cha mbali (kitu cha kawaida cha CORBA) kwa jina. Kwa kutumia mbinu nyembamba (org.omg.CORBA. Object obj) ya darasa la helloHelper (iliyotolewa na mkusanyaji wa idlj), tunapata marejeleo ya kitu kwenye kiolesura cha hujambo.

Jina la kamba = "Habari";

helloImpl = HelloHelper.narrow(ncRef.resolve_str(jina));

Ninajua kuwa CORBA hukuruhusu kutekeleza vitu vingi kwenye lugha mbalimbali programu na hata kukimbia kwenye nodi tofauti za kompyuta. Hata hivyo, je, ni muhimu kuwa na ORB mbili tofauti zilizoandikwa katika lugha mbili tofauti?

Mfano: Node A huanza Programu ya Java J1, na nodi B inaendesha programu ya C++ C1. Je! nipate "Java ORB" ya Node A na "C++ ORB" ya Node B au nifanye zote/baadhi ya ORB zishirikiane na programu zilizoandikwa kwa lugha yoyote ambayo ina ramani ya IDL?

Ningeshukuru sana ikiwa mtu angeweza kuniunganisha na chanzo, akieleza moja kwa moja jinsi ningependa ielezwe. Ya karibu zaidi ambayo nimepata ni "njia ya mpangaji programu hudanganya muundo au umoja, hupiga simu ya mbali kwa kutumia proksi, au kutekeleza kiolesura na darasa la mtumishi, kwa njia ile ile katika bidhaa zote za CORBA C++, kwa njia ile ile katika Java yote. bidhaa za CORBA, nk." d. ". Hii inanifanya nifikirie kuwa nitahitaji ORB mbili, lakini sio wazi vya kutosha. Kimsingi ningependa kujua ikiwa naweza kusema kwamba "kwa kuwa ORB imeandikwa katika C++, waandaaji wa programu pia wamepigwa marufuku kutumia C++".

Shukrani kwa

3 majibu

Haijalishi ORB inatekelezwa kwa lugha gani, cha muhimu ni kwamba inatoa vifungo vya lugha gani. Kwa lugha ya L, unahitaji orb ambayo hutoa vifungo kwa lugha ya L. Mara nyingi orbs hutoa tu kifungo kwa lugha ambayo wao wenyewe huandikwa, lakini pia inaweza kutoa vifungo kwa baadhi ya lugha nyingine.

Hapana. Hoja ya CORBA ni kwamba inatenganisha vipengele kabisa.

Ni wazi, programu zako lazima zitumie maktaba za mteja ambazo zinaweza kuingiliana nazo. ORB yako inaweza tu kusakinisha vifungo vya lugha moja, kwa hali ambayo utahitaji kutafuta vifungo vingine au kutafuta njia ya kuingiliana navyo (kwa mfano, ikiwa unatumia Python, bado unaweza kufanya kazi na maktaba za C++ ikiwa unataka. )

Jaribu kutumia teknolojia hii.

Kuna mbinu kadhaa zinazoweza kutumika wakati wa kutekeleza maombi ya CORBA, lakini ili kujumlisha, ndiyo, mfumo wa ORB lazima uwe katika lugha sawa na utekelezaji wa ombi lako.

Katika Java na C++, mkusanyaji wa IDL hutengeneza vijiti na mifupa ambayo hutumika kama gundi kati ya mtandao na programu yako. Unatoa utekelezaji wa vitu vyako vya CORBA, kwa kawaida vinarithi kutoka kwa darasa la IDL linalozalishwa na mkusanyaji (mifupa). Mifupa kwa namna fulani hupokea ombi kutoka kwa mteja na kisha huita utekelezaji wako. Kitu kimoja kinatokea kinyume chake kwa upande wa mteja.

Mifupa na mbegu kisha hutumia mbinu zinazotolewa na ORB kuita seva kwa mbali na kujibu, hata ikiwa ni pamoja na kuanzisha miunganisho ya mtandao ikiwa mteja na seva ziko kwenye mashine tofauti. "Uchawi" huu unatekelezwa na ORB na lazima uwepo katika programu yako katika mfumo wa maktaba, seti ya vitendaji, n.k. ambayo mbegu na mifupa itatumia kufanya kazi hiyo.

Kwa hivyo kila mpango lazima uwe na aina fulani ya uwakilishi wa ORB ili kuwasiliana na wateja na seva zingine za CORBA kwenye mashine zingine.

Walakini, kutoka kwa maoni ya kimantiki, ORB inaonekana kama safu ambayo kwa kweli na bila mshono inaunganisha wateja na seva zote mbili, kwa hivyo hata ikiwa programu ya C ++ ina utekelezaji wa ORB ulioandikwa katika C ++ na utekelezaji wa Java, ikiwa na ORB iliyoandikwa katika Java. ni ya kichawi itifaki za kawaida(GIOP, IIOP), wanaweza kuwasiliana na kila mmoja bila shida yoyote.


Ripoti lazima iwe na:

    Taarifa ya tatizo lililotatuliwa na programu inayofanya kazi vizuri.

    Mwongozo wa mtumiaji wa programu iliyotatuliwa, iliyo na maelezo ya violesura vya vitendaji vyote vya programu.

    Orodha ya programu na maoni muhimu.

  1. Maswali ya kudhibiti

          CORBA ni nini?

          Nini kilitokea IDL? Ni ya nini?

          Je, mteja na seva huingiliana vipi?CORBA?

          Je, data huhamishwaje kati yao?

          Je, seva ya jina ni ya nini?

          Jinsi inavyoanza CORBA seva?

  1. Fasihi

    Ken Arnold, James Gosling, David Holmes.Lugha ya programu ya Java™.

    Tovuti rasmiJavahttp:// java. jua. com/ (kuna sehemu katika Kirusi na kitabu cha maandishi).

    Java™ 2 SDK, Hati za Toleo la Kawaida - http://java.sun.com/products/jdk/1.5/index.html.

    James Gosling, Bill Joy, Guy Steele.Uainishaji wa lugha Java ( Uainishaji wa Lugha ya Java http :// www . javasoft . com / hati / vitabu / jls /). Tafsiri kwa lugha ya Kirusi -http:// www. umoja- vologda. ac. ru/ java/ jls/ index. html

    Tovuti rasmi ya mradiKupatwa kwa juahttp:// www. kupatwa kwa jua. org/.

  1. Kiambatisho cha 1. CORBA

Teknolojia CORBA (KawaidaKituOmbiDalaliUsanifu) ni kiwango cha kuandika maombi yaliyosambazwa yaliyopendekezwa na muunganoMungu wangu (FunguaUsimamiziKikundi) Kwa kuunda vitu vya CORBA, tunaweza, kwa mfano, kupunguza kwa kiasi kikubwa muda unaohitajika kutatua matatizo ambayo yanahitaji kiasi kikubwa cha hesabu. Hili linawezekana kwa kuweka vitu vya CORBA kwenye mashine tofauti. Kila kitu cha mbali hutatua kazi ndogo maalum, na hivyo kumwondolea mteja kazi isiyo ya lazima.

Msingi wa CORBA ni Dalali wa Ombi la Kitu. ORB inasimamia mwingiliano wa vitu katika mazingira ya mtandao iliyosambazwa. IIOP (Itifaki ya Mtandao wa Inter-ORB) ni itifaki maalum ya mwingiliano kati ya ORB.

Kitu maalum kinachoitwa stub hufanya kazi katika nafasi ya anwani ya mteja. Baada ya kupokea ombi kutoka kwa mteja, hupakia vigezo vya ombi katika muundo maalum na kupeleka kwa seva, au tuseme kwa mifupa.

Mifupa ni kitu kinachofanya kazi katika nafasi ya anwani ya seva. Baada ya kupokea ombi kutoka kwa mteja, huifungua na kuituma kwa seva. Mifupa pia hubadilisha majibu ya seva na kuyapitisha kwa mteja (stub).

Ili kuandika programu yoyote ya CORBA kwa kutumia teknolojia ya Java, unahitaji kuwa na vitu viwili - kifurushi cha JDK1.5 kilichosakinishwa na mkusanyaji wa idlj (…\ jdk 1.5.0\ bin\ idlj. mfano) JDK hutoa seti ya madarasa ya kufanya kazi na vitu vya CORBA, na idlj hupanga lugha ya IDL hadi Java.

6 .1 Kuunda programu rahisi ya CORBA

      1. Kuandika kiolesura

Uumbaji CORBA maombi yamewashwa Javahuanza na kuandika kiolesura cha kitu cha mbali kwa kutumia lugha ya maelezo ya kiolesura (KiolesuraUfafanuziLugha, IDL).

Hebu tuundefailihabari.idl

moduli ya HelloApp

interface Habari

kamba sayHello();

kuzima kwa njia moja ();

Kiolesura hiki kinaelezea njia mbili tukuzimisha Na semaHujambo . Zaidi ya hayo, haijalishi kwetu njia hizi zinafanya nini, jambo kuu ni kwamba tunaamua kuwa zipo na kuamua ni vigezo gani vya pembejeo na pato wanazo.

Ifuatayo unapaswa kuendesha mkusanyajiIDL- kwa- Javaidlj:

idlj – kuangukaHabari. idl

Folda mpya imeonekana kwenye saraka ya sasaHabari Programu , ambayo ina faili sita za java. Kila mmoja wao ana madhumuni yake mwenyewe.

    HabariPOA. javajava- darasa la kufikirika ambalo sio zaidi ya mifupa ya seva (mifupa) na hutoa utendaji wa seva.

    _ HabariStub. java- darasa linalotekeleza mbegu ( mbegu) mteja. Hutoautendaji wa mteja.

    HabariMsaidizi. java Na HelloHolder. java- madarasa ambayo hutoa kazi za msaidizi kwaCORBA vitu.

    HelloOperesheni. java- darasa lililo na maelezo ya kiolesurahabari katika lugha Java.

    Habari. java- darasa - mrithiHelloOperesheni, kiolesura cha kusaidiaorg. Mungu wangu. CORBA. Kitu.

      1. Kuunda seva

Sasa kazi yetu ni kuandika darasa linalotumia kiolesurahabari . Kwa upande wetu itakuwaHabariImpl . Tafadhali kumbuka kuwa ni mrithi wa darasaHabariPOA . KATIKA HabariImpl mbinu zilizotangazwa ndaniHabari . idl .

Ili kurahisisha kazi, tamko la mbinu linaweza kuchukuliwa kutoka kwa faili HelloOperesheni . java , imetengenezwa jdlj .

orb ya kibinafsi ya ORB;

orb = orb_val;

Kamba ya umma semaHello() (

rudi "\nHujambo ulimwengu!!\n";

kuzima kwa utupu wa umma () (

orb.shutdown(uongo);

Hatua inayofuata ni kuunda halisiseva sehemu ya programu. Hii itakuwa darasaHelloServer.

Itakuwa na njia moja tu - kazi ya kawaidakuu.

Jambo la kwanza tunalofanya ni kuunda ORB. Kisha tunaunda mfano wa darasa la kitu cha mbali (HabariImpl) na uisajili katika ORB. Ifuatayo, tunaita huduma ya jina maalum (NameService) na kujiandikisha jina la kitu cha mbali ndani yake ili mteja apate kuipata.

Hebu tuangalie kwa makini hatua hizi.

1. Uundaji na uanzishaji wa ORB. Imetolewa kwa kupiga simu njia tulindani yake darasa la ORB

2. Kuunda mfano wa darasa la kitu cha mbali na kusajili katika ORB

helloImpl.setORB(orb);

3. Kupata muktadha wa jina (NamingContext)

org.omg.CORBA. Object objRef =

Katika mstari wa kwanza tunapata rejeleo la kitu kwa huduma ya jina (NameService). Lakini kwa kweli hiki ni kitu cha kawaida cha CORBA na ili kuitumia kama muktadha wa kumtaja (NamingContext), unahitaji kupiga njia hiyo.nyembamba darasa NamingContextHelper , ambayo inaonekana kubainisha kipengee hiki cha CORBA.

4. Kusajili jina la kitu cha mbali (HabariImpl)

Jina la kamba = "Habari";

ncRef. funga tena (njia, href);

Jina limesajiliwa ili mteja apate kitu cha mbali. Kusudi hili linahudumiwa na kazifunga tena (JinaComponentnc, Kituobj) interface NamnaMuktadha.

5. Kusubiri maombi kutoka kwa mteja

orb. kukimbia();

Seva sasa iko tayari kutumika.

// HelloServer.java

agiza HelloApp.*;

kuagiza org.omg. CosNaming.*;

agiza org.omg.CORBA.*;

kuagiza org.omg. PortableServer.*;

kuagiza org.omg. PortableServer.POA;

ingiza java.util. Mali;

darasa HelloImp inapanua HelloPOA (

orb ya kibinafsi ya ORB;

utupu wa umma setORB(ORB orb_val) (

orb = orb_val;

// tumia njia ya sayHello()

Kamba ya umma semaHello() (

rudi "\nHujambo ulimwengu!!\n";

// tumia njia ya kuzima ()

kuzima kwa utupu wa umma () (

orb.shutdown(uongo);

darasa la umma HelloServer (

utupu tuli wa umma (String args) (

jaribu (

ORB orb = ORB.init(args, null);

// pata marejeleo ya rootpoa na uwashe POAMAnager

POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

rootpoa.the_POAMmanager().amilisha();

// unda mtumishi na uisajili na ORB

HelloImpl helloImpl = HelloImpl mpya ();

helloImpl.setORB(orb);

// pata kumbukumbu ya kitu kutoka kwa mtumishi

org.omg.CORBA. Ref ya kitu = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.finyu(ref);

// NameService inaomba huduma ya jina

orb.resolve_initial_references("NameService");

// Tumia NamingContextExt ambayo ni sehemu ya Interoperable

// Uainishaji wa Huduma ya Kutaja (INS).

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// funga Rejeleo la Kitu katika Kutaja

Jina la kamba = "Habari";

Njia ya Kipengele cha Jina = ncRef.to_name(jina);

ncRef.rebind(njia, href);

System.out.println("HelloServer iko tayari na inasubiri...");

// subiri maombi kutoka kwa wateja

orb.run();

kukamata (Isipokuwa e) (

System.err.println("ERROR:" + e);

System.out.println("HelloServer Inatoka...");

      1. Kuunda mteja

Wacha tuendelee kuandika nambari ya mteja.

Hatua za msingi za kuandika maombi ya mteja

    Uundaji na Uanzishaji wa ORB

    Kupata muktadha wa huduma ya jina (NamnaMuktadha)

    Kutafuta kitu cha mbali

    Kupiga simu kwa njia ya sayHello.

    Kupiga simu kwa njia ya kuzima.

Kama unaweza kuona, vidokezo viwili vya kwanza vinaambatana na hatua za kuunda programu ya seva, kwa hivyo hatutazingatia.

Hoja ya tatu pia ni rahisi sana kutekeleza. Kitu kinaundwaJinaComponent. Njia hiyo inaitwakutatua (JinaComponentnjia), ambayo hutafuta kitu cha mbali kwa jina (kawaidaCORBAkitu). Kwa kutumia mbinunyembamba (org. Mungu wangu. CORBA. Kituobj) darasa habariMsaidizi(iliyotolewaidljcompiler) tunapata rejeleo la kitu kwenye kiolesurahabari.

Jina la kamba = "Habari";

Sasa unaweza kupiga simu njiasemaHujambo:

Njiakuzimishahuzima seva.

helloImpl.shutdown();

//testClient.java

agiza HelloApp.*;

kuagiza org.omg. CosNaming.*;

kuagiza org.omg. CosNaming. NamingContextPackage.*;

agiza org.omg.CORBA.*;

darasa la umma HelloClient

{

tuli Habari hujamboImpl;

utupu tuli wa umma (String args)

{

jaribu (

// unda na uanzishe ORB

ORB orb = ORB.init(args, null);

// pata muktadha wa kumtaja mzizi

org.omg.CORBA. Object objRef =

orb.resolve_initial_references("NameService");

// Tumia NamingContextExt badala ya NamingContext. Hii ni

// sehemu ya Huduma inayoingiliana ya kumtaja.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// suluhisha Rejeleo la Kitu katika Kutaja

Jina la kamba = "Habari";

helloImpl = HelloHelper.narrow(ncRef.resolve_str(jina));

System.out.println("Imepata mpini kwenye kitu cha seva:" + helloImpl);

System.out.println(helloImpl.sayHello());

helloImpl.shutdown();

) kukamata (Isipokuwa e) (

System.out.println("ERROR:" + e);

e.printStackTrace(System.out);

}

}

}

      1. Mkusanyiko Na uzinduzi maombi

MafailiHelloServer. java na HelloClient. java, Habari. idlna foldaHelloApp, imeundwaidkj. mfanolazima ihifadhiwe kwenye folda moja.

Kukusanya mteja na seva unahitaji mstari wa amri piga

javac *.java HelloApp/*.java

javac. mfanoiko katika…\jdk1.5.0\ bin.

JumatanoKupatwa kwa juahairuhusu kukimbiaCORBAmaombi. Kwa kuanzia

1. Anzisha hudumaorbdKitu Ombi Dalali Daemon (…\ jdk1.5.0\ bin\ orbd. mfano) Hii inafanywa ili tuweze kupata kiunga cha huduma ya jina.

kuanza orbdORBInitialPort 1050

Kigezo -ORBInitialPort- nambari ya bandari ambayo seva ya jina itafanya kazi.

2. Uzinduzi seva

seva ya jina.

3. Uzinduzi mteja

Hubainisha lango ambalo seva ya jina inafanya kazi. Parameta - ORBInitialHost inabainisha mwenyeji ambayo inaendeshaseva ya jina.

Kwa urahisi wa mkusanyiko na uzinduzi, unaweza kuundapopofaili:

idlj – kuanguka Hello.idl

javac *.java HelloApp/*.java

anza java HelloServer - ORBInitialPort 1050 - ORBInitialHost localhost

java HelloClient - ORBInitialPort 1050 - ORBInitialHost localhost


6.2 Lugha ya IDL

LughaMungu wangu IDL (Kiolesura Ufafanuzi Lugha- Lugha ya Maelezo ya Kiolesura) ni sintaksia isiyotegemea teknolojia ya kuelezea violesura vya vitu. Wakati wa kuelezea usanifu wa programu,Mungu wangu IDLhutumika vyema kama nukuu ya ulimwengu wote kwa kufafanua mipaka ya kitu ambacho huamua tabia yake kuhusiana na vipengele vingine vya mfumo wa habari.Mungu wangu IDLhukuruhusu kuelezea violesura ambavyo vina mbinu na sifa tofauti. Lugha pia inasaidia urithi wa interface, ambayo ni muhimu kwa tumia tena vitu na uwezekano wa upanuzi wao au vipimo.

IDLni lugha ya kujieleza tu, yaani haina utekelezaji wowote.IDLvipimo vinaweza kukusanywa (kuchorwa) katika faili za vichwa na prototypes maalum za seva ambazo zinaweza kutumika moja kwa moja na kipanga programu. Hiyo niIDLnjia fulani zinaweza kuandikwa, na kisha kutekelezwa, katika lugha yoyote ambayo uchoraji wa ramani unapatikanaIDL. Lugha kama hizo ni pamoja naC, C++, SmallTalk, Pascal, Java, Ada.

Kwa kutumiaIDLUnaweza kuelezea sifa za sehemu, na madarasa ya wazazi ambayo hurithi, na isipokuwa ambazo hutupwa, na, hatimaye, mbinu zinazofafanua kiolesura, na maelezo ya vigezo vya pembejeo na pato.

MuundoCORBA IDLfaili inaonekana kama hii:

moduli (

;

;

;

kiolesura [:] (

;

;

;

;

()

.

.

()

.

.

}

kiolesura [:]

.

.

}

Sintaksia ya lughaIDLni nyepesi kabisa na haiwezekani kuielezea katika mwongozo wa kufundishia.

Ili kutekeleza kiolesura cha seva ya barua, unaweza kuongezaHabari. idl

moduli ya HelloApp

{

muundo wa TMessage

{

kamba Kwa;

kamba Kutoka;

Ujumbe wa kamba;

};

typedef mlolongo TMessages;

interface Habari

{

TMessages GetMessages (katika Jina la kamba, hesabu fupi);

njia moja utupu Tuma (katika kamba Mteja, katika kamba Jina, katika kamba Ujumbe);

kamba sayHello();

kuzima kwa njia moja ();

};

};

typedef mlolongo wa TMessages; tangazo aina yenye nguvu safu ujumbeTMessage.

CORBA ( Usanifu wa Dalali wa Ombi la Kawaida)- teknolojia inayolenga kitu kwa kuunda programu zilizosambazwa. Teknolojia inategemea matumizi Wakala wa Ombi la Kitu (ORB) kwa kutuma na kupokea maombi kwa uwazi na vitu katika mazingira yaliyosambazwa. Teknolojia inakuwezesha kujenga maombi kutoka kwa vitu vilivyosambazwa vinavyotekelezwa katika lugha mbalimbali za programu. Kawaida CORBA kuendelezwa Kikundi cha Usimamizi wa Vitu (OMG).

Usanifu wa CORBA

KATIKA sehemu hii imepewa mapitio mafupi CORBA kama ilivyoelezwa katika vipimo Mungu wangu toleo la 3.0. Mahitaji ya hati hii yanaweza kutimizwa kwa viwango tofauti kwa utekelezaji halisi. madalali wa ombi la kitu. Katika Mtini. Mchoro 2.1 unaonyesha ombi lililotumwa na mteja kwa utekelezaji wa kitu. Mteja ni huluki inayotaka kufanya operesheni kwenye kitu, na Utekelezaji ni mkusanyo wa msimbo na data ambayo hutekeleza kitu.

ORB inawajibika kwa mifumo yote muhimu ya kupata utekelezaji unaofaa wa kitu kwa ombi, kuandaa utekelezaji wa kupokea ombi, na uhamishaji wa data unaendelea kutimiza ombi. Kiolesura kinachoonekana kwa mteja ni huru kabisa na eneo la utekelezaji wa kitu, lugha ya programu ambayo imeandikwa, na mambo mengine yoyote ambayo hayajaonyeshwa katika vipimo vya interface.

Kiolesura cha simu kinachobadilika na kiolesura cha stub kina semantiki sawa, ili mpokeaji wa ujumbe hawezi kubainisha jinsi ombi lilitumwa. ORB hupata msimbo unaofaa wa utekelezaji wa kitu, hutuma vigezo kwake na kutoa udhibiti kupitia IDL mifupa au mifupa yenye nguvu (Mchoro 2.4). Mifupa ni maalum kwa kiolesura fulani na adapta ya kitu. Wakati wa utekelezaji wa hoja, utekelezaji unaweza kutumia huduma fulani ORB kupitia adapta ya kitu. Wakati ombi limekamilika, udhibiti na maadili ya matokeo yanarejeshwa kwa mteja.

Utekelezaji wa kitu unaweza kuchagua adapta ya kitu gani itumie kulingana na huduma gani inahitaji. Katika Mtini. Mchoro 2.5 unaonyesha jinsi kiolesura na taarifa za utekelezaji zinapatikana kwa wateja na utekelezaji wa kitu. Maingiliano yameelezewa ndani IDL au kutumia hazina ya kiolesura. Maelezo yao hutumika kutengeneza mbegu za mteja na mifupa kwa ajili ya utekelezaji.

Taarifa kuhusu utekelezaji wa kitu hutolewa wakati wa ufungaji na kuhifadhiwa kwenye hifadhi ya utekelezaji, na kisha kutumika wakati wa mchakato wa utoaji wa ombi.

Alexander Godin

Teknolojia ya CORBA ni kiwango cha kuandika maombi yaliyosambazwa yaliyopendekezwa na muungano wa OMG (Open Management Group). Kwa kuunda vitu vya CORBA, tunaweza, kwa mfano, kupunguza kwa kiasi kikubwa muda unaohitajika kutatua matatizo ambayo yanahitaji kiasi kikubwa cha hesabu. Hili linawezekana kwa kuweka vitu vya CORBA kwenye mashine tofauti. Kila kitu cha mbali hutatua kazi ndogo maalum, na hivyo kumwondolea mteja kazi isiyo ya lazima.

Wacha tuangalie mwingiliano wa vitu katika usanifu wa CORBA

Mtini. 1 Mwingiliano wa vitu katika usanifu wa CORBA

Msingi wa CORBA ni Dalali wa Ombi la Kitu. ORB inasimamia mwingiliano wa vitu katika mazingira ya mtandao iliyosambazwa. IIOP (Itifaki ya Mtandao wa Inter-ORB) ni itifaki maalum ya mwingiliano kati ya ORB.

Kitu maalum kinachoitwa stub hufanya kazi katika nafasi ya anwani ya mteja. Baada ya kupokea ombi kutoka kwa mteja, hupakia vigezo vya ombi katika muundo maalum na kupeleka kwa seva, au tuseme kwa mifupa.

Mifupa ni kitu kinachofanya kazi katika nafasi ya anwani ya seva. Baada ya kupokea ombi kutoka kwa mteja, huifungua na kuituma kwa seva. Mifupa pia hubadilisha majibu ya seva na kuyapitisha kwa mteja (stub).

Ili kuandika programu yoyote ya CORBA kwa kutumia teknolojia ya Java, unahitaji kuwa na vitu viwili - kifurushi cha JDK1.2 kilichosakinishwa na kikusanyaji. idltojava. JDK hutoa seti ya madarasa ya kufanya kazi na vitu vya CORBA, na idltojava ramani ya lugha ya IDL hadi Java.

Kuunda programu ya CORBA katika Java huanza kwa kuandika kiolesura cha kitu cha mbali kwa kutumia Lugha ya Ufafanuzi wa Kiolesura (IDL).

Hebu tuunde faili test.idl testApp ya moduli (jaribio la kiolesura ( hesabu ndefu (katika kamba msg); );

Kiolesura hiki kinaelezea njia moja tu hesabu. Zaidi ya hayo, haijalishi kwetu njia hii inafanya nini, jambo kuu ni kwamba tunaamua kuwa iko, tunaamua ni vigezo gani vya pembejeo na pato.

Hebu tumia mkusanyaji idltojava.

Idltojava Hello.idl Kumbuka. Mkusanyaji huyu hutumia kichakataji cha awali cha lugha ya C++ kwa chaguo-msingi, kwa hivyo sio lazima kushughulika na ujumbe wa makosa Amri au jina la faili si sahihi(njia yake lazima ibainishwe katika utofauti wa mazingira wa CPP) zima matumizi yake kwa kuweka bendera. idltojava -fno-cpp Hello.idl Matokeo ya programu hii yanaweza kuwakilishwa kwa namna ya mchoro.

Mtini.2 Uendeshaji wa mkusanyaji wa idltojava
Folda mpya imeonekana kwenye saraka ya sasa testApp, ambayo ina faili tano za java. Kila mmoja wao ana madhumuni yake mwenyewe.

_testImplBase.java - darasa la abstract ambalo sio zaidi ya mifupa ya seva (mifupa) na hutoa utendaji wa seva;

_testStub.java - darasa linalotumia mbegu ya mteja. Hutoa utendaji wa mteja;

test.java - darasa lililo na maelezo ya kiolesura cha majaribio katika Java;

testHelper.java Na testHolder.java - madarasa ambayo hutoa huduma za matumizi kwa vitu vya CORBA.

Sasa kazi yetu ni kuandika darasa linalotumia kiolesura mtihani. Madarasa kama hayo yanapaswa kutajwa ili jina lao liwe na neno "Mtumishi", kwa upande wetu litakuwa testMtumishi.

Class testServant huongeza _testImplBase ( public int count(String msg) ( return msg.length(); ) )

Tafadhali kumbuka kuwa darasa hili limerithiwa kutoka _testImplBase. Kama unaweza kuona, njia ya kuhesabu inatekelezwa hapa, ambayo in katika mfano huu Huhesabu idadi ya barua katika ujumbe uliopokelewa.

Sasa hebu tuendelee kuandika sehemu ya seva ya programu.

Jambo la kwanza tunalofanya ni kuunda ORB. Kisha tunaunda mfano wa darasa la kitu cha mbali (testServant) na kuisajili kwenye ORB. Ifuatayo, tunaita huduma maalum ya jina (NameService) na kujiandikisha jina la kitu cha mbali ndani yake ili mteja apate kuipata (kuna njia nyingine ya kupata kitu cha mbali, lakini zaidi juu yake baadaye).

Hebu tuangalie kwa makini hatua hizi.

  1. Uundaji na uanzishaji wa ORB. Imetolewa kwa kupiga simu njia tuli ndani yake darasa la ORB

    ORB orb = ORB.init();

  2. Kuunda mfano wa darasa la kitu cha mbali na kusajili katika ORB

    testServant testRef = new testServant();

    orb.connect(testRef);

  3. Kupata muktadha wa kumtaja (NamingContext)

    org.omg.CORBA.Object objRef =

    orb.resolve_initial_references("NameService");

    NamingContext ncRef = NamingContextHelper.narrow(objRef);

    katika mstari wa kwanza tunapata rejeleo la kitu kwa huduma ya jina (NameService). Lakini kwa kweli hiki ni kitu cha kawaida cha CORBA na ili kuitumia kama muktadha wa kumtaja (NamingContext), unahitaji kupiga njia hiyo. nyembamba darasa NamingContextHelper, ambayo inaonekana kubainisha kipengee hiki cha CORBA.

  4. Kusajili jina la kitu cha mbali (testServant)

    Kama ilivyoelezwa hapo awali, usajili wa jina unafanywa ili mteja apate kitu cha mbali. Kusudi hili linahudumiwa na kazi rebind(NameComponent nc, Object obj) kiolesura NamnaMuktadha.

    NameComponent nc = new NameComponent("test", ""); // parameta ya kwanza // inaonyesha jina la kitu, // si lazima kutumia njia ya pili ya NameComponent = (nc); ncRef.rebind(njia, testRef);

  5. Inasubiri maombi kutoka kwa mteja. java.lang.Object Sync = new java.lang.Object(); iliyosawazishwa (usawazishaji) ( sync.wait(); )

    Baada ya seva kusindika ombi kutoka kwa mteja na kutekeleza njia hesabu itaingia katika hali ya kusubiri tena.

Seva sasa iko tayari kutumika

Kuorodhesha 1. testServer.java

Ingiza testApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; agiza org.omg.CORBA.*; agiza java.lang.*; class testServant huongeza _testImplBase ( public int count(String msg) ( return msg.length(); ) ) testServer ya darasa la umma ( public void main(String args) ( jaribu ( ORB orb = ORB.init(args, null); testServant testRef = new testServant(); orb.connect(testRef); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); NameComponent nc("NewTestService) ", ""); NameComponent path = (nc); ncRef.rebind(path, testRef); java.lang.Object sync = new java.lang.Object(); iliyosawazishwa (sync) ( sync.wait() ) ) catch (Isipokuwa e) ( System.err.println("ERROR: " + e); e.printStackTrace(System.out); ) ) )

Tafadhali kumbuka kuwa shughuli zote zinazofanywa kwenye vipengee vya CORBA ziko kwenye kizuizi cha kujaribu kukamata.

Wacha tuendelee kuandika nambari ya mteja.

Hatua za msingi za kuandika maombi ya mteja

  1. Uundaji na Uanzishaji wa ORB
  2. Kupata muktadha wa huduma ya jina ( NamnaMuktadha)
  3. Kutafuta kitu cha mbali
  4. Njia ya Kuita hesabu.

Kama unaweza kuona, vidokezo viwili vya kwanza vinaambatana na hatua za kuunda programu ya seva, kwa hivyo hatutazingatia.

Hoja ya tatu pia ni rahisi sana kutekeleza. Kitu kinaundwa JinaComponent. Njia hiyo inaitwa kutatua (njia ya Kipengele cha Jina), ambayo hutafuta kitu cha mbali (kitu cha kawaida cha CORBA) kwa jina. Kwa kutumia mbinu nyembamba(org.omg.CORBA.Object obj) darasa testMsaidizi(iliyotolewa idltojava compiler) tunapata rejeleo la kitu kwenye kiolesura mtihani.

NameComponent nc = new NameComponent("test", ""); Njia ya Kipengele cha Jina = (nc); org.omg.CORBA.Object obj= ncRef.resolve(njia); test testRef = testHelper.narrow(obj);

Sasa unaweza kupiga simu njia hesabu

String msg = "jaribu kuhesabu"; int count = testRef.count(msg);

Kuorodhesha 2. testClient.java

Ingiza testApp.*; import org.omg.CosNaming.*; agiza org.omg.CORBA.*; agiza java.lang.*; public class testClient ( public static void main(String args) ( jaribu ( ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper. nyembamba(objRef); NameComponent nc = new NameComponent("test", ""); NameComponent path = (nc); test testRef = testHelper.narrow(ncRef.resolve(njia)); String msg = "jaribu kuhesabu"; int count = testRef.count(msg); System.out.println("idadi ya herufi katika ujumbe ni:" + count); ) catch (Isipokuwa e) ( System.out.println("ERROR: " + e) ​​​; e.printStackTrace(System.out); ) ))

Kuzindua maombi

  1. Kuanzisha seva ya jina (iliyojumuishwa na JDK1.2). Hii inafanywa ili tuweze kupata kiunga cha huduma ya jina la tnameserv

    kwa chaguo-msingi seva huanza kwenye mlango wa 900. Thamani hii inaweza kubadilishwa kwa kubainisha kigezo cha uzinduzi -ORBInitialPort, kwa mfano.

    Tnameserv -ORBInitialPort 1024

  2. Kuanzisha seva testServer java testServer -ORBInitialPort 1024 // inaonyesha bandari // ambayo seva ya jina hufanya kazi
  3. Kuzindua mteja testClient java testClient -ORBInitialHost javas.stu.neva.ru -ORBInitialPort 1024

    parameta ya -ORBInitialHost inabainisha seva pangishi ambayo inaendesha testServer

baada ya kutekeleza programu hii, koni itaonyeshwa

Idadi ya herufi katika ujumbe ni:12

Kuunganisha kwa seva bila kutumia huduma ya jina

Wazo la msingi la njia hii ni kwamba seva huhifadhi mfano wa darasa la kitu cha mbali ( testMtumishi) kama faili ya maandishi popote, kupatikana kwa mteja. Mteja hupakia data kutoka kwa faili (kwenye kitu Kamba) na hubadilisha kwa kutumia njia maalum kuwa kumbukumbu ya kitu kwa kitu cha mbali.

Yote hii inatekelezwa kama ifuatavyo

Wacha tuondoe sehemu fulani ya nambari - hii inatumika pia kwa mteja ( testServer.java Na testClient.java)

  1. Hebu tuondoe org.omg.CosNaming.* kutoka kwa maktaba ya kuleta. org.omg.CosNaming.NamingContextPackage.*;
  2. Wacha tufute nambari inayolingana na hatua ya 3-kipengee cha 4
Badala ya msimbo wa mbali, tutaingiza - kwa seva: // kubadilisha kitu kwa kamba Kamba ior = orb.object_to_string(testRef); Jina la faili la kamba = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; //tengeneza faili test_file Fos ya FileOutputStream = FileOutputStream mpya(jina la faili); PrintStream ps = PrintStream(fos) mpya; // andika data kwake ps.print(ior); ps.funga();

kwa mteja:

Jina la faili la kamba = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; // fungua faili FileInputStream fis = new FileInputStream(jina la faili); DataInputStream dis = DataInputStream mpya(fis); //soma data Kamba ior = dis.readLine(); //geuza kuwa kitu cha CORBA org.omg.CORBA.Object obj = orb.string_to_object(ior); // pata marejeleo ya jaribio la kifaa cha mbaliRef = testHelper.narrow(obj);

Wacha tukusanye programu, tuzindua seva na mteja kwa njia ile ile kama tulivyofanya hapo awali (endesha seva ya jina ndani kwa kesi hii Hakuna haja).