Bean-uri asincrone |
|
|
![]() |
|
Configurare şi rulare | Note tehnice | Javadoc | Construire cu Ant |
Localizarea tabelelor de bază de date |
Localizarea codului sursă |
Examinarea notelor despre codare |
Utilizatori z/OS: Codul sursă pentru Exemple nu este furnizat pe platforma z/OS deoarece aplicaţiile Exemplu nu sunt construite pe platforma z/OS.
Exemplul constă din trei componente principale:
Figura 1: Privire generală
Toate trei componentele sunt incluse în fişierul WebSphereTrader.ear, care este un fişier EAR singur.
Serverul de generare preţuri este un serviciu care publică cote de preţuri fictive pentru diferite coduri mnemonice la un singur subiect JMS (Java Message Service). Puteţi porni serviciul dintr-un bean Startup (PriceGenBootstrapBean) sau un servlet (ControllerServlet). Ambele metode cheamă bean-ul sesiune PriceGenControlBean pentru a porni serviciul. Serviciul constă din următoarele fişiere J2EE (Java Platform 2 Enterprise Edition):
Bean-ul PriceGenControlBean creează:
Instrucţiunile extrase din bean-ul RawTickerConfigBean
includ codurile mnemonice disponibile şi informaţii despre cum să se genereze preţurile pentru ele.
Fiecare alarmă de preţ este asociată cu un singur cod mnemonic şi porneşte pe baza
unor reguli, folosind instrucţiunile care sunt extrase din bean-ul RawTickerConfigBean.
Preţurile pentru un cod şi alte informaţii sunt publicate la subiectul ABSample_PriceGen_Topic. Fiecare mesaj publicat are cheie codul mnemonic.
Alarma puls publică un mesaj puls (heartbeat) pe un subiect JMS (ABSample_PriceGen_HeartBeat_Topic)
la un interval predefinit. Un alt proces din serverul de curgere ticker
ascultă pentru mesaje, în timpul intervalului specificat, pentru a determina starea
serverului de generare preţuri.
Figura 2: Server generare preţuri
Serverul de curgere ticker este un serviciu care trage informaţiile de preţ de la subiectul JMS de generare preţuri (ABSample_PriceGen_Topic) şi le trimite clienţilor HTTP conectaţi care se abonează la codurile mnemonice selectate. Serviciul constă din următoarele fişiere J2EE:
Serviciul se iniţializează automat când este creat obiectul
StreamApplicationState, fie de bean-ul Startup (TickerStreamBootstrapBean), fie când
primul client se conectează la servleturi. Obiectul StreamApplicationState conţine
un domeniu (scope) asincron cu o conexiune subiect JMS la ABSample_PriceGen_Topic, un puls
PriceGen SubsystemMonitor (PriceGen SSM) şi o alarmă puls pentru serverul de curgere ticker.
Figura 4: Iniţializare server curgere ticker
Un bean controlat de mesaje (PriceGenHeartBeatMDBBean) este folosit pentru a
traduce mesajele pulsului ABSample_PriceGen_HeartBeat_Topic în apeluri ale metodei ping method la monitorul
subsistemului puls (heartbeat) PriceGen (PriceGen SSM). Clienţii ascultă pentru
difuzarea de evenimente de către domeniul asincron şi PriceGen SSM, care conţine
instrucţiuni despre comportament.
De exemplu, PriceGen SSM poate notifica clienţii că serverul de generare preţuri
este perimat sau mort, iar domeniul asincron notifică StreamApplicationState când este distrus.
Figure 5: Monitor de sănătate Price Generator
Servletul de logare la serverul de curgere ticker (LoginServlet) acceptă informaţiile de logare ale clientului. Când un client WebSphere Trader se loghează la serverul curgere ticker, este creat un obiect StreamClientState cu un domeniu asincron, folosind numele de logare furnizat. Acest domeniu asincron este un copil al domeniului asincron din obiectul StreamApplicationState, creat când se iniţializează serverul curgere ticker. În plus este creat un monitor subsistem (Client SSM) şi adăugat domeniului asincron al clientului care capturează informaţiile de puls de la aplicaţia clientului.
Figura 6: Logarea clientului şi iniţializarea
Serverul de curgere ticker al servletului streaming (StreamingServlet) cu un obiect StreamListener asigură curgerea preţurilor codurilor mnemonice, informaţiile de stare a generatorului de preţuri, precum şi pulsul serverului de curgere ticker clientului HTTP ataşat. Când clientul se conectează la acest servlet, au loc următoarele evenimente în ordinea listată:
Figura 7: Diagrama StreamingServlet
Un TickerSubscriber este un lucru asincron, responsabil de ascultarea subiectului JMS ABSample_PriceGen_Topic şi de procesarea tuturor mesajelor pentru un singur cod mnemonic.
Un obiect TickerSubscriber este activ pentru fiecare cod mnemonic pentru care ascultătorul StreamListener este înregistrat să asculte.
Când un obiect StreamListener este înregistrat la un ascultător pentru un cod
mnemonic dat, TickerSubscriber ascultă la subiectul ABSample_PriceGen_Topic şi obţine mesaje pentru cod, folosind o instrucţiune select.
Pentru fiecare mesaj, porneşte un eveniment de notificare către toţi ascultătorii StreamListener cu un obiect nou construit ClientInstruction.
Ascultătorul StreamListener plasează obiectul ClientInstruction pentru notificare într-o coadă CurrentBuffer.
Coada CurrentBuffer poate introduce date mai repede decât poate scoate.
Dimensiunea buffer-ului este limitată, astfel încât dacă subiectul JMS este mult mai rapid decât ascultătorul, mesajul cel mai vechi este abandonat.
Acest comportament este bun într-un streamer de ticker. Ascultătorul
StreamerListener în firul de execuţie StreamingServlet în acelaşi timp buclează
deasupra cozii CurrentBuffer, trimiţându-i conţinutul la scriitorul de tipărire al servletului.
Figura 8: Curgerea preţurilor codurilor mnemonice
Servletul cerere de modificare al serverului de curgere ticker (UpdateServlet)
capturează cererile de modificare ticker de la un client WebSphere Trader. Când
servletul primeşte un nou set de coduri mnemonice, este extras obiectul StreamClientState pentru iD-ul de logare specificat.
Codurile mnemonice sunt actualizate şi este trimis un eveniment la toţi ascultătorii cu modificarea de conţinut.
![]()
Figura 9: Cerere de actualizare cod mnemonic
Cu servletul ping al serverului de curgere ticker (PingServlet), un client
WebSphere Trader poate trimite pulsuri la Client SSM în obiectul StreamClientState care este
creat în timpul logării clientului. Când monitorul subsistem client (Client SSM)
determină că a fost oprit clientul, el distruge domeniul asincron asociat clientului
şi eliberează toţi ascultătorii şi toate resursele.
Figure 10: Monitor de sănătate Client
Serverul de curgere ticker curăţă conexiunile client folosind
servletul LogoutServlet sau Client SSM. LogoutServlet poate distruge obiectul StreamClientStateID-ul de logare.
Client SSM detectează şi când nu a primit niciun puls de la client şi trimite o
notificare subsystemIsDead la ascultătorul StreamClientState asociat.
Când obiectul StreamClientState detectează acest eveniment, el se şterge pe sine şi domeniul asincron pe care-l deţine.
Prin ştergerea domeniului (scope) asincron, toate resursele care sunt deţinute de acel domeniu sunt distruse automat.
![]()
Figura 11: Curăţare client
Clientul WebSphere Trader este un aplet Java (StreamerApplet) care permite unui utilizator să se logheze la serverul curgere ticker printr-o conexiune HTTP, să primească informaţii de curgere ticker, informaţii de stare a serverului de generare preţuri şi mesaje puls de la alarma puls StreamApplicationState. Acest serviciu este împachetat în fişierul J2EE WebSphereTraderWeb.war şi conţine următoarele fişiere JAR (arhivă Java).
Apletul utilizează două fluxuri HTTP pentru a conversa cu serverul curgere ticker:
Când un utilizator se loghează cu un ID de client arbitrar, este creat un singur obiect URLSenderHandler toate notificările de la obiectul URLSenderHandler. Servletul LoginServlet apoi invocă şi răspunsul este trimis apletului prin interfaţa ascultătorului. Când o logare are succes, sunt create un singur StreamerHandler, PingerHandler şi ServerMonitor. Apletul se înregistrează pe sine ca ascultător la obiectele StreamerHandler şi ServerMonitor.
Obiectul StreamerHandler invocă servletul StreamingServlet şi rămâne activ, asamblînd obiecte ClientInformation de la obiectul InputStreamReader deschis pe care le trimite mai departe la aplet prin intermediul ascultătorilor înregistraţi. Apletul procesează sincron mesajele ClientInformation şi actualizează interfaţa de utilizator a apletului în mod corespunzător.
Firul de execuţie PingerHandler trimite mesaje asemănătoare mesajelor ping la un interval regulat către servletul PingServlet, prin obiectul singular URLSenderHandler.
Obiectul ServerMonitor primeşte indirect mesaje de puls StreamApplicationState de
la obiectul StreamerHandler prin intermediul apletului. Când obiectul ServerMonitor
nu primeşte pulsuri printr-o metodă ping la intervalul dat, trimite notificări de
perimare şi moarte către aplet prin intermediul interfeţei ascultătorului.
Obiectul ServerMonitor este similar ca funcţionalitate cu monitorul subsistem şi alarmele bean-urilor asincrone.
![]()
Figura 12: Interacţiune aplet