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:
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.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 aChannelListener
. Zvanītājs var abonēt ne tikai pats, bet arī jebkuru cituChannelListener
uz jebkuru kanālu vai jebkuru klausītāju skaitu vienā kanālā.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 noMessageBus
ieviešana
Kanāls
gadījumus izveido un saglabā Kanāls
statiskais 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); }