Programavimas

Parašyk savo MAMĄ!

MOM yra neteisingai suprasta ir mama negauna jokio kredito. Galbūt girdėjote šį tą anksčiau, bet paskirstytų sistemų arenoje tai iš tikrųjų tiesa! Taip yra todėl, kad į pranešimą orientuota tarpinė programinė įranga (MOM) tradiciškai nebuvo tokia pat rafinuota ir palaikoma kaip kitos technologijos, naudojamos paskirstytojo ryšio sistemose.

Tačiau laikai keičiasi. Pristatant sudėtingus, patikimus tiekėjų pasiūlymus, susidomėjimas MOM sistemomis sparčiai auga. Geras „MOM“ diegimas suteikia aukšto lygio programų sąsają, paslaugų kokybės garantijas ir daugybę paslaugų, tokių kaip saugumas, pranešimų eilės nustatymas ir katalogų palaikymas, reikalingi „pramoninio stiprumo“ paskirstytam ryšiui.

Paskirstytos komunikacijos sistemos

Skirstomosios komunikacijos sistemos tikslas - suteikti gerą būdą paskirstytosios sistemos dalims bendrauti. Į objektą orientuotos sistemos atlieka šią užduotį, suteikdamos paskirstytiems objektams būdą pranešti vieni kitiems.

Daugiausiai dėmesio skiria paskirstytos į objektą orientuotos sistemos, kurios modeliuoja pranešimus kaip metodo iškvietimus. CORBA ir RMI yra du puikūs tokio tipo sistemų pavyzdžiai (žr. Ištekliai). Šios sistemos dažnai vadinamos nuotolinių procedūrų iškvietimo (RPC) sistemomis. Šių sistemų magija yra ta, kad nuotolinių procedūrų (arba metodų) skambučiai yra vietinių procedūrų iškvietimai (LPC).

RPC yra sukonstruoti pagal kliento / serverio modelį. Pavyzdžiui, CORBA objektai, atskleidžiantys metodus, kuriuos turi iškviesti nuotoliniai objektai, vadinami serveriais (ir yra).

Pristatome MOM

Priešingai nei RPC, MOM pranešimus nemodeliuoja kaip metodo iškvietimus; vietoj to jie modeliuoja juos kaip įvykius įvykių pristatymo sistemoje. Klientai siunčia ir gauna įvykius arba „pranešimus“ per API, kurias teikia MOM. MOM gali pateikti katalogų paslaugas, leidžiančias klientams ieškoti kitos programos, veikiančios kaip serveris, arba gali pateikti universalius „kanalus“, leidžiančius klientų grupei bendrauti kaip su bendraamžiais, arba gali pateikti abi parinktis.

Visos programos tiesiogiai bendrauja tarpusavyje naudodamosi MOM. Programų sugeneruoti pranešimai yra prasmingi tik kitiems klientams, nes pati MOM yra tik pranešimų maršrutizatorius (o kai kuriais atvejais ir pranešimų eilės sistema).

MOM yra įvairių formų ir dydžių

Visoms MOM yra dvi pagrindinės charakteristikos: jos leidžia perduoti pranešimą, o pranešimas nėra blokuojantis. Be šių pagrindų, pardavėjai gali įdiegti bet kokį skaičių skirtingų sąsajų ir paslaugų.

Daugelis MOM teikia paskelbimo ir prenumeratos sąsają, leidžiančią programoms skelbti ir gauti jiems įdomius pranešimus. Ši sąsaja gali būti kanalų sistema arba paprastesnė sistema, kurioje klientas registruoja pranešimų tipus. ji suinteresuota gauti.

Pagrindiniai MOM teikia tik tiesioginius pranešimus, jokių papildomų paslaugų. Pažangios MOM teikia pranešimų eilę ir garantuoja pristatymą kartu su saugumu, įvairių platformų duomenų sutvarkymu, masteliu ir kitais pranašumais.

MAMOS iš pirmo žvilgsnio

Čia pateikiama trumpa nuoroda, kuri padės jums sužinoti, kas yra MOM.

MOM privalumai

  • Paprasta: Klientai skelbia ir prenumeruoja

    „public-and-subscribe“ yra naudinga aukšto lygio abstrakcija, skirta programoms, kurias reikia atlikti norint bendrauti.

  • Lengva: Nereikia sudėtingos sąrankos

    MOM lengva įdiegti ir naudoti, skirtingai nuo sudėtingų RPC pagrįstų sistemų, tokių kaip CORBA.

  • Bendrasis: Ta pati MOM gali būti naudojama kelioms programoms

    Kadangi bet kuri MOM sistema iš esmės yra tik bendras pranešimų perdavimas, ją galima pakartotinai naudoti skirtingose ​​programose be papildomo darbo.

  • Lankstus: Galima perduoti bet kokias žinutes

    Bet kuri žinutė gali būti perduota MOM. Kadangi mama nesupranta pranešimų, nesvarbu, kokie jie yra.

MAM trūkumai

  • Bendrasis: Programos turi suprasti pranešimus

    Priversti programas naudoti pranešimus, o ne metodo skambučius, gali būti sudėtinga, ypač jei programa remiasi tuo, kad metodo skambučiai blokuojami.

  • Nepažįstamas: Nemodeliuoja metodo iškvietimų

    Kūrėjams, kurie nėra susipažinę su pranešimais, gali kilti problemų, kaip išsiaiškinti, kaip juos efektyviai naudoti.

  • Asinchroninis: Pranešimai nėra blokuojami

    Žinutės natūraliai nėra blokuojamos. Tai apsunkina programų, kurioms reikia blokuoti skambučius, rašymą.

  • Per daug paprasta: Nėra duomenų

    Net ir paprastos RPC sistemos teisingai tvarko duomenis. Paprastos MOM gali tiesiog siųsti pranešimus, kuriuose baitai nėra tvarkingi imtuvo požiūriu.

  • Nestandartinis: Pardavėjai yra visoje lentoje

    Pardavėjo MOM įgyvendinimai daro viską ... ir nieko.

    Įspėjimo „Emptor“

    yra frazė, į kurią reikia atsižvelgti peržiūrint įvairius pardavėjų pasiūlymus.

Kada tinkamos MOM?

  • Bendraujant programoms reikia naudoti pranešimus
  • Kai programavimo personalas nėra susietas su kliento / serverio ir RPC sistemomis
  • Kai CORBA / RMI ir susijusios sistemos yra per sudėtingos
  • Kai paprastos RPC sistemos yra per daug elementarios

Mūsų MOM dizaino aspektai

Dabar, kai fone nėra kelio, pradėkime kurti savo MAM Pranešimų magistralė. Mes naudosime MOM, kad įgalintume ryšį tarp paskirstytų lentų klientų. (Žr. Šaltinius, kuriuose pateikiamos nuorodos į informaciją apie lentos programą, su kuria dirbome keletą pastarųjų dalių.)

„Message Bus“ svarbiausia yra tai, kad jis suteikia patogią aukšto lygio ryšio sąsają su programos objektais, kurie ja naudosis.

Kadangi kanalas yra prasmingas kaip centrinė paslauga, kurią turėtų teikti „Message Bus“, sąsaja su „Message Bus“ yra Kanalas klasė. Klientas naudoja Kanalas klasę, kad galėtumėte naudotis visomis aukšto lygio „Message Bus“ funkcijomis, nuo prenumeratos ir paskelbimo iki galimų kanalų įtraukimo į sistemą.

Kanalas klasė atskleidžia klasės metodus, kurie veikia visą pranešimų magistralę arba yra susiję su visais kanalais. Kiekvienas kanalo egzempliorius reiškia vieną kanalą sistemoje ir atskleidžia kanalo specifinius metodus.

Dvi sąsajos, „ChannelListener“ ir „ChannelsUpdateListener“, yra skirti abonentams gauti pranešimus kanale ir gauti pranešimą apie kanalo papildymą.

Žemiau pateiktas paveikslėlis iliustruoja „Message Bus“ sistemos architektūrą.

Po gaubtu

Po gaubtu „Message Bus“ programa naudoja. Klasės metodus ir duomenų struktūras

Kanalas

sekti kanalus. Kanalo klausytojai įgyvendina

„ChannelListener“

sąsaja, o objektai, norintys gauti kanalo naujinius, prideda

„ChannelsUpdateListener“

sąsaja. Registruotus klausytojo objektus iškviečia atgal

Kanalas

kai tik nutinka kas nors įdomaus. Visas bendravimas su išoriniu pasauliu atliekamas įgyvendinant transporto rūšį

„MessageBus“

sąsaja, pvz

„MessageBusSocketImpl“

.

Kiekvienas „MessageBus“ diegimas perduoda pranešimus kalbėdamasis su atitinkamu pranešimų perdavimo serveriu, vadinamu brokeriu, bendro tinklo transportu, pavyzdžiui, lizdais ar URL / servletais. Brokeris nukreipia pranešimus tarp „MessageBus“ egzempliorių, kurių kiekvienas atitinka a Kanalas klasė.

Kadangi šie konkretaus transporto pritaikymai įgyvendina „MessageBus“ sąsaja, jie yra keičiami. Pavyzdžiui, servleto pagrindu „MessageBus“ ir brokeris gali naudotis Kanalas vietoje lizdų pagrindu „MessageBus“ ir brokeris.

„Mūsų pranešimų magistralė“ yra paprasta kanalų pagrindu sukurta „peer-to-peer“ sistema, todėl ji tinkama naudoti „peer-to-peer“ programose, tokiose kaip bendradarbiavimo sistema.

Pranešimų magistralės naudojimas kliento programoje

Šie veiksmai leidžia klientui naudoti pranešimų magistralę:

  1. Nustatykite „MessageBus“.

     Channel.setMessageBus (naujas MessageBusSocketImpl (BROKER_NAME, BROKER_PORT)); 

    Šiame kvietime naujas „MessageBus“ sukurtas įgyvendinimas, brokerį identifikuojant pagal konstruktoriaus iškvietimo argumentus.

  2. Prenumeruokite kanalą.

     Kanalo textChannel = Channel.subscribe ("text_channel", tai); 

    Šis iškvietimas pateikia kanalo egzempliorių, atitinkantį kanalo pavadinimo argumentą. Jei kanalo nėra, jis sukuriamas sistemoje.

    Praeina tai kaip argumentas reiškia, kad tas skambinantysis pats yra a „ChannelListener“. Skambinantysis gali užsiprenumeruoti ne tik save, bet ir bet kurį „ChannelListener“ kanalą ar bet kurį vieno kanalo klausytojų skaičių.

  3. Paskelbkite pranešimą kanale.

     textChannel.publish (nauja eilutė („myID +“ sako „Labas!“)); 

    Pranešimo paskelbimas yra paprastas ir nereikalauja nieko kito, kaip tik paskambinti paskelbti () pasirinktame kanalo egzemplioriuje. Atkreipkite dėmesį, kad pranešimas gali būti bet kokio tipo objektas, jei tik kiti kanalo klientai jį supranta ir serveris turi prieigą prie pranešimų klasės failo (-ų) (kaip išsamiai aprašyta skyriuje Naudojant pranešimų magistralę)

Papildomus pasirenkamus veiksmus sudaro:

  • Atšaukite kanalo klausytojo prenumeratą.

     textChannel.unsubscribe (ChannelListener); 

    Šis metodas atšaukia pavadintą prenumeratą „ChannelListener“ iš kanalo, o tai reiškia, kad klausytojas negaus jokių naujų pranešimų. Klausytojai turėtų būti atsisakomi tokiu būdu, kai jų nebereikia.

  • Gaukite kanalų pavadinimų sąrašą.

     Surašymo kanalas.getChannelNames (); 

    Šis metodas grąžina visų pranešimų magistralėje galimų kanalų pavadinimus.

  • Prenumeruokite, kad gautumėte naujai pridėtus kanalus.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    A „ChannelsUpdateListener“ gali užsiprenumeruoti gauti naujinius, kai kanalai bus pridėti prie pranešimų magistralės.

  • Nebegaukite naujai pridėtų kanalų.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    A „ChannelsUpdateListener“ galima atsisakyti kanalo papildymo naujinių. Klausytojai turėtų būti atsisakomi tokiu būdu, kai jų nebereikia.

  • Pridėkite daugiau kanalo klausytojų.

     textChannel.subscribe (ChannelListener); 

    Šis metodas leidžia skambinančiajam užsiprenumeruoti papildomus kanalo klausytojus.

     Eilutė textChannel.getName (); 

    Šis metodas pateikia šio kanalo egzemplioriaus pavadinimą.

Sąsaja „ChannelListener“

„ChannelListener“ sąsają turi įdiegti bet kuris objektas, kurį reikia atnaujinti, kai tam tikrame kanale ateina pranešimas.

viešoji sąsaja ChannelListener {public void messageReceived (kanalo kanalas, objekto pranešimas); } 

Daugeliu atvejų klientas, kuris prašo a Kanalas egzempliorius pats užsiprenumeruos kanalą ir pats įdiegs šią sąsają, tačiau tai nėra būtina. Laikydamasis JDK 1.1 įvykių adapterių, klientas gali užsiprenumeruoti kitą objektą kanale, kad jis sunaudotų kanalo sugeneruotus pranešimus.

Tiesą sakant, vienas klausytojo objektas gali užsiprenumeruoti kelis kanalus, kurie iškvies klausytojo messageReceived () kiekvieną kartą, kai bet kuriame iš kanalų ateina pranešimas. messageReceived () metodo skambutis suteikia prieigą prie kanalo, kuriame pasirodė pranešimas, leidžiant messageReceived () atskirti pranešimus pagal pradinį kanalą.

Sąsaja „ChannelsUpdateListener“

„ChannelsUpdateListener“ turi būti įgyvendintas bet kokio objekto, kuris nori būti atnaujintas, kai pridedamas kanalas.

viešoji sąsaja ChannelsUpdateListener {public void channelAdded (String name); } 

Klasė Kanalas

Kanalas klasė tarnauja dviem tikslams:

  • Tai suteikia paprastą abstrakciją kaip sąsają klientui, naudojant „Message Bus“
  • Jis palaiko pasaulinę būsimų kanalų būseną ir perduoda pranešimus iš kanalų į „MessageBus“ diegimą ir gauna atnaujinimus iš „MessageBus“ įgyvendinimas

Kanalas egzempliorius kuria ir saugo Kanalasstatinis kodas. Nuorodas į juos perduoda Channel.subscribe () kaip prašo klientas. Kiekvienas Kanalas egzempliorius yra unikalus JVM procese.

viešosios klasės kanalas {

apsaugotas statinis boolean busSet = false; saugoma statinė „MessageBus“ magistralė; apsaugoti statiniai „Hashtable“ kanalai = naujas „Hashtable“ (); apsaugoti statiniai vektoriniai kanalaiUpdateListeners = new Vector ();

public static synchronized void setMessageBus (MessageBus mb) meta IOException {if (! busSet) {bus = mb; bus.initBroker (); busSet = tiesa; } else System.out.println ("Negaliu nustatyti MessageBus daugiau nei vieną kartą per vykdymo laiką!"); }

viešoji statinė eilutė getBrokerName () {return bus.getBrokerName (); }

public static Enumeration getChannelNames () {return channels.keys (); }

Šie klasės metodai leidžia „MessageBus“ egzempliorius, kurį reikia nustatyti vieną kartą kiekvienam vykdymo laikui, ir grąžinti informaciją apie atitinkamai magistralės ir kanalo pavadinimus.

 viešasis statinis sinchronizuotas kanalo prenumerata (eilutės pavadinimas, ChannelListener cl) išmeta IOException {Channel ch; if (kanalai.komponentaiKey (vardas)) ch = (kanalas) kanalai.get (vardas); else {bus.addChannel (vardas); ch = naujas kanalas (vardas); kanalai.put (vardas, ch); } ch.prenumeruoti (cl); grįžti ch; } 

Šis klasės metodas pateikia kanalo egzempliorių, atitinkantį kanalo pavadinimą. Tai sukuria kanalą ir skambina „MessageBus“ pridėti jį prie sistemos, jei jos dar nėra. Kai tik kanalas bus sukurtas, jame bus užregistruotas jo pradinis klausytojas.

// klientai kviečiami užregistruoti „ChannelsUpdateListener public public static void subscribeChannelsUpdates“ (ChannelsUpdateListener cul) {kanalaiUpdateListeners.addElement (cul); }

// klientai kviečiami išregistruoti kanalusUpdateListener public static void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.removeElement (cul); }