Programmēšana

Uzraksti pati savu MAMMU!

MOM tiek pārprasta, un MOM nesaņem kredītu. Jūs, iespējams, jau dzirdējāt šo, bet izplatīto sistēmu arēnā tā patiesībā ir taisnība! Tas ir tāpēc, ka uz ziņojumu orientētā starpprogrammatūra (MOM) tradicionāli nav baudījusi tādu pašu izsmalcinātības un atbalsta līmeni kā citas tehnoloģijas, ko izmanto izplatīto sakaru ietvaros.

Bet laiki mainās. Ieviešot izsmalcinātus, stabilus pārdevēju piedāvājumus, interese par MOM sistēmām strauji pieaug. Laba MOM ieviešana nodrošina augsta līmeņa lietojumprogrammu saskarni, pakalpojumu kvalitātes garantijas un daudzus pakalpojumus, piemēram, drošību, ziņojumu rindošanu un direktoriju atbalstu, kas nepieciešami "rūpnieciski spēcīgai" izplatītai komunikācijai.

Izplatīti sakaru ietvari

Sadalītās komunikācijas ietvara mērķis ir nodrošināt labu veidu, kā sazināties izplatītās sistēmas daļām. Objektorientētās ietvari izpilda šo uzdevumu, nodrošinot izplatītiem objektiem veidu, kā ziņot viens otram.

Izplatītās objektorientētās ietvarstruktūras, kurām tiek pievērsta vislielākā uzmanība, ir tās, kas modificē ziņojumapmaiņu kā metodes izsaukumus. CORBA un RMI ir divi izcili šāda veida ietvaru piemēri (skatīt resursus). Šīs sistēmas bieži sauc par attālās procedūras izsaukuma (RPC) sistēmām. Šo sistēmu burvība ir tā, ka tās veic attālinātos procedūru (vai metožu) izsaukumus, šķiet, ir vietējo procedūru izsaukumi (LPC).

RPC tiek veidoti pēc klienta / servera modeļa. Piemēram, CORBA objekti, kas atklāj metodes, ko izsauc attāli objekti, tiek saukti (un ir) serveri.

Iepazīstinām ar MOM

Atšķirībā no RPC, MOM ziņojumus ne modelē kā metodes izsaukumus; tā vietā viņi tos modelē kā notikumus notikumu piegādes sistēmā. Klienti sūta un saņem notikumus vai "ziņojumus", izmantojot MOM nodrošinātās API. MOM var piedāvāt direktoriju pakalpojumus, kas ļauj klientiem meklēt citu lietojumprogrammu, kas darbojas kā serveris, vai var piedāvāt universālus "kanālus", kas ļauj klientu grupai sazināties kā vienaudžiem, vai arī var piedāvāt abas iespējas.

Visas lietojumprogrammas tieši sazinās savā starpā, izmantojot MOM. Lietojumprogrammu ģenerētie ziņojumi ir nozīmīgi tikai citiem klientiem, jo ​​pati MOM ir tikai ziņojumu maršrutētājs (un dažos gadījumos arī ziņojumu rindošanas sistēma).

MOM ir visu veidu un izmēru

Visām MOM ir divi galvenie raksturlielumi: tie ļauj nodot ziņojumu un ziņu nodošana nav bloķējoša. Papildus šiem pamatiem pārdevēji var ieviest jebkuru dažādu saskarņu un pakalpojumu skaitu.

Daudzi MOM nodrošina publicēšanas un abonēšanas saskarni, lai lietojumprogrammas varētu publicēt un saņemt viņus interesējošus ziņojumus. Šī saskarne var izpausties kā kanālu sistēma vai vienkāršāka sistēma, kurā klients reģistrē ziņojumu veidus. tas ir ieinteresēts saņemt.

Pamata MOM nodrošina tikai tiešos ziņojumus, bez papildu pakalpojumiem. Uzlabotas MOM nodrošina ziņojumu rindošanu un garantētu piegādi, kā arī drošību, starpplatformu datu sakārtošanu, mērogojamību un citas priekšrocības.

MOM īsumā

Šeit ir ātra informācija, kas palīdzēs jums uzzināt, kas ir MOM.

MOM priekšrocības

  • Vienkārši: Klienti publicē un abonē

    publicēt un abonēt ir noderīga augsta līmeņa abstrakcija tam, kas lietotnēm jādara, lai sazinātos.

  • Viegli: Nav nepieciešama sarežģīta iestatīšana

    MOM ir viegli uzstādīt un lietot, atšķirībā no sarežģītām uz RPC balstītām sistēmām, piemēram, CORBA.

  • Vispārējs: Vienu un to pašu MOM var izmantot vairākām lietotnēm

    Tā kā jebkura konkrētā MOM sistēma būtībā ir tikai vispārējs ziņojumu transports, to var atkārtoti izmantot dažādās lietojumprogrammās bez papildu darba.

  • Elastīgs: Jebkura veida ziņojumus var nodot

    Jebkura ziņa var tikt nodota MOM. Tā kā MOM nesaprot ziņojumus, nav svarīgi, kādi tie ir.

MOM trūkumi

  • Vispārējs: Lietojumprogrammām ir jāsaprot ziņojumi

    Likt lietojumprogrammām izmantot ziņojumus metodi izsaukumu vietā var būt sarežģīti, it īpaši, ja lietojumprogramma paļaujas uz to, ka metode izsauc bloķēt.

  • Nezināms: Netiek modelēti metodes izsaukumi

    Izstrādātājiem, kuri nezina ziņojumus, var rasties problēmas saprast, kā tos efektīvi izmantot.

  • Asinhrona: Ziņojumi netiek bloķēti

    Ziņojumi, protams, netiek bloķēti. Tas apgrūtina tādu lietotņu rakstīšanu, kurām ir jābloķē zvani.

  • Pārāk vienkārši: Nav datu šķirošanas

    Pat vienkāršas RPC sistēmas pareizi sastāda datus. Vienkārši MOM var vienkārši nosūtīt ziņojumus, kuros baiti no uztvērēja viedokļa nav kārtībā.

  • Nestandarta: Pārdevēji ir pa visu dēli

    Pārdevēja MOM ieviešana dara visu ... un neko.

    Caveat Emptor

    ir frāze, kas jāpatur prātā, pārskatot dažādos pārdevēju piedāvājumus.

Kad MOM ir piemēroti?

  • Sazinoties ar lietotnēm, jāizmanto ziņojumi
  • Kad programmēšanas personāls nav piesaistīts klienta / servera un RPC sistēmām
  • Kad CORBA / RMI un saistītās sistēmas ir pārāk sarežģītas
  • Kad vienkāršas RPC sistēmas ir pārāk elementāras

Dizaina apsvērumi mūsu MOM

Tagad, kad fons ir no ceļa, sāksim salikt mūsu MOM Ziņojumu kopne. Mēs izmantosim MOM, lai iespējotu saziņu starp izplatīto tāfeles klientiem. (Skatiet resursus, lai iegūtu saites uz informāciju par tāfeles lietojumprogrammu, ar kuru mēs strādājām pēdējās daļās.)

Ziņojumu kopnes vadošais apsvērums ir tas, ka tā nodrošina ērtu augsta līmeņa sakaru saskarni lietojumprogrammu objektiem, kuri to izmantos.

Tā kā kanālam ir jēga kā centrālajam pakalpojumam, kas jānodrošina ziņojumu kopnei, interfeiss ar ziņojumu kopni ir Kanāls klasē. Klients izmanto Kanāls klase, lai piekļūtu visām ziņu kopnes augsta līmeņa funkcijām, sākot no abonēšanas un publicēšanas līdz pieejamo kanālu uzskaitīšanai sistēmā.

The Kanāls klase atklāj klases metodes, kas ietekmē ziņojumu kopu kopumā vai attiecas uz visiem kanāliem. Katrs kanāla gadījums pārstāv vienu kanālu sistēmā un atklāj kanālam raksturīgas metodes.

Divas saskarnes, ChannelListener un ChannelsUpdateListener, ir paredzēti abonēšanai, lai saņemtu ziņas kanālā, un attiecīgi saņemtu paziņojumu par kanāla pievienošanu.

Zemāk redzamais attēls ilustrē Message Bus sistēmas arhitektūru.

Zem kapuces

Zem pārsega lietojumprogramma Message Bus izmanto klases metodes un datu struktūras

Kanāls

sekot kanāliem. Kanāla klausītāji ievieš

ChannelListener

interfeisu un objekti, kuri vēlas saņemt atjauninājumus par kanālu, ievieš

ChannelsUpdateListener

interfeiss. Reģistrētos klausītāju objektus izsauc

Kanāls

ikreiz, kad notiek kaut kas interesants. Visa saziņa ar ārpasauli tiek veikta, izmantojot transporta specifisku ieviešanu

MessageBus

interfeiss, piemēram,

MessageBusSocketImpl

.

Katrs MessageBus ieviešana nodod ziņojumus, runājot ar atbilstošu ziņojumu pārsūtīšanas serveri, ko sauc par starpnieku, izmantojot koplietojamo tīkla transportu, piemēram, kontaktligzdas vai URL / servlet. Brokeris maršrutē ziņojumus starp MessageBus gadījumi, no kuriem katrs atbilst a Kanāls klasē.

Tā kā šīs konkrētajam transportam paredzētās ieviešanas visas īsteno MessageBus interfeisu, tie ir savstarpēji aizvietojami. Piemēram, uz servleta bāzes MessageBus un brokeri var izmantot Kanāls ligzdu bāzes vietā MessageBus un brokeris.

Mūsu ziņojumu kopne ir vienkārša vienādranga sistēma, kuras pamatā ir kanāli, padarot to piemērotu lietošanai vienādranga lietojumprogrammās, piemēram, sadarbības sistēmā.

Ziņojumu kopnes izmantošana klienta lietojumprogrammā

Šīs darbības ļauj klientam izmantot ziņojumu kopni:

  1. Iestatiet MessageBus.

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

    Šajā aicinājumā jauns MessageBus tiek izveidota realizācija, starpnieku identificējot pēc konstruktora izsaukuma argumentiem.

  2. Abonējiet kanālu.

     Kanāla tekstsChannel = Channel.subscribe ("text_channel", šis); 

    Šis zvans atgriež kanāla gadījumu, kas atbilst argumentam kanāla nosaukums. Ja kanāls nepastāv, tas tiek izveidots sistēmā.

    Iet garām šo kā arguments nozīmē, ka šis zvanītājs pats ir a ChannelListener. Zvanītājs var abonēt ne tikai pats, bet arī jebkuru citu ChannelListener uz jebkuru kanālu vai jebkuru klausītāju skaitu vienā kanālā.

  3. Publicējiet ziņojumu kanālā.

     textChannel.publish (jauna virkne (myID + "saka Sveiki!")); 

    Ziņojuma publicēšana ir vienkārša un nenozīmē tikai zvanu publicēt() izvēlētajā kanāla instancē. Ņemiet vērā, ka ziņojums var būt jebkura veida objekts, ja vien citi kanāla klienti to var saprast un serverim ir piekļuve ziņojumu klases failam (-iem) (kā detalizēti aprakstīts sadaļā Ziņojumu kopnes izmantošana)

Papildu izvēles darbības ietver:

  • Anulēt klausītāja abonēšanu kanālā.

     textChannel.unsubscribe (ChannelListener); 

    Šī metode anulē nosaukto abonēšanu ChannelListener no kanāla, kas nozīmē, ka klausītājs nesaņems jaunus ziņojumus. Šādā veidā klausītāji jāatsakās, ja tie vairs nav vajadzīgi.

  • Iegūstiet kanālu nosaukumu sarakstu.

     Uzskaitījums Channel.getChannelNames (); 

    Šī metode atgriež visu ziņojumu kopnē pieejamo kanālu nosaukumus.

  • Abonējiet, lai saņemtu nesen pievienotos kanālus.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener var abonēt, lai saņemtu atjauninājumus, kad kanāli tiek pievienoti ziņojumu kopnei.

  • Pārtrauciet tikko pievienoto kanālu saņemšanu.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener var anulēt kanālu pievienošanas atjauninājumus. Šādā veidā klausītāji jāatsakās, ja tie vairs nav vajadzīgi.

  • Pievienojiet kanālam vairāk klausītāju.

     textChannel.subscribe (ChannelListener); 

    Šī metode ļauj zvanītājam abonēt papildu klausītājus kanālam.

     String textChannel.getName (); 

    Šī metode atgriež šī kanāla instances nosaukumu.

Saskarne ChannelListener

The ChannelListener interfeiss ir jāievieš jebkuram objektam, kuru vēlaties atjaunināt, kad ziņa ienāk konkrētā kanālā.

publiskā saskarne ChannelListener {public void messageReceived (kanāla kanāls, objekta ziņojums); } 

Vairumā gadījumu klients, kurš lūdz a Kanāls instance abonēs kanālu un pats ieviesīs šo saskarni, taču tas nav nepieciešams. Saskaņā ar JDK 1.1 notikumu adapteriem klients var abonēt citu objektu kanālā, lai tas patērētu kanāla ģenerētos ziņojumus.

Faktiski viens klausītāja objekts var abonēt vairākus kanālus, kas piezvanīs klausītājam messageReceived () katru reizi, kad ziņojums ienāk kādā no kanāliem. The messageReceived () metodes zvans nodrošina piekļuvi kanālam, kurā parādījās ziņojums, ļaujot messageReceived () lai atdalītu ziņojumus pēc izcelsmes kanāla.

Saskarne ChannelsUpdateListener

ChannelsUpdateListener jāievieš jebkuram objektam, kuru vēlaties atjaunināt, kad tiek pievienots kanāls.

publiskā saskarne ChannelsUpdateListener {public void channelAdded (virknes nosaukums); } 

Klase Kanāls

The Kanāls klasei ir divi mērķi:

  • Tas nodrošina vienkāršu abstrakciju kā saskarni klientam, izmantojot ziņojumu kopni
  • Tas uztur globālo stāvokli par pieejamajiem kanāliem un nosūta ziņojumus no kanāliem uz MessageBus ieviešanu un saņem atjauninājumus no MessageBus ieviešana

Kanāls gadījumus izveido un saglabā Kanālsstatiskais kods. Atsauces uz tiem nodod Channel.subscribe () kā pieprasījis klients. Katrs Kanāls eksemplārs ir unikāls JVM procesā.

sabiedrības klases kanāls {

aizsargāta statiskā būla kopneSet = false; aizsargāta statiskā MessageBus kopne; aizsargāti statiski hashtable kanāli = new hashtable (); aizsargāti statiski vektoru kanāliUpdateListeners = new Vector ();

public static synchronized void setMessageBus (MessageBus mb) throws IOException {if (! busSet) {autobuss = mb; bus.initBroker (); busSet = true; } else System.out.println ("Nevar iestatīt MessageBus vairāk kā vienu reizi izpildlaika laikā!"); }

publiskā statiskā virkne getBrokerName () {return bus.getBrokerName (); }

publiskais statiskais uzskaitījums getChannelNames () {return channels.keys (); }

Šīs klases metodes ļauj MessageBus katram izpildes laikam jāiestata vienreiz, un jāatgriež informācija par attiecīgi kopnes un kanālu nosaukumiem.

 publiskā statiskā sinhronizētā kanāla abonēšana (virknes nosaukums, ChannelListener cl) met IOException {Channel ch; if (channels.containsKey (nosaukums)) ch = (Channel) kanāli.get (name); else {bus.addChannel (nosaukums); ch = jauns kanāls (nosaukums); kanāli.put (nosaukums, ch); } ch.subscribe (cl); atgriezties ch; } 

Šī klases metode atgriež kanāla gadījumu, kas atbilst kanāla nosaukumam. Tas izveido kanālu un zvanus MessageBus lai to pievienotu sistēmai, ja tāda vēl nav. Tiklīdz kanāls ir izveidots, tajā tiek reģistrēts tā sākotnējais klausītājs.

// klienti aicināja reģistrēt ChannelsUpdateListener public static void subscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.addElement (cul); }

// klienti aicinājuši atcelt reģistrācijas kanāluUpdateListener public static void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.removeElement (cul); }

$config[zx-auto] not found$config[zx-overlay] not found