Asynchronous beans - WebSphere Trader


Localizarea tabelelor de bază de date
Localizarea codului sursă
Examinarea notelor despre codare

Localizarea tabelelor de bază de date

Numele bazei de date pentru acest Exemplu este PRICEGENTBL, care se află în baza de date Derby, PRICEGEN. Pentru a deschide baza de date şi vizualiza tabela, consultaţi ghidul utilizatorului bazei de date Derby.

Localizarea codului sursă

Localizaţi codul sursă în:
directorul profile_root/samples/src/AsynchBeans/WebSphereTrader.

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.

Examinarea notelor despre codare

Exemplul constă din trei componente principale:

Diagrama Privire generală
Figura 1: Privire generală

Toate trei componentele sunt incluse în fişierul WebSphereTrader.ear, care este un fişier EAR singur.

Server generare preţuri

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.

Diagrama Server generare preţuri
Figura 2: Server generare preţuri

Server curgere ticker

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:

Pornirea şi iniţializarea

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.

Diagramă iniţializare server curgere ticker
Figura 4: Iniţializare server curgere ticker

Monitorizarea stării generatorului de preţuri

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.

Diagrama monitorului subsistem (SSM) Price Generator
Figure 5: Monitor de sănătate Price Generator

Logarea şi iniţializarea clientului

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.

Diagramă LoginServlet
Figura 6: Logarea clientului şi iniţializarea

Curgerea datelor

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ă:

Obiectul StreamListener se înregistrează pe sine la obiectele StreamApplicationState, StreamClientState şi TickerSubscriber. Aceste obiecte notifică în mod continuu obiectul StreamListener şi apoi convertesc informaţiile în text folosind un obiect ClientInstruction, care este trimis clientului HTTP prin intermediul obiectului Response al servletului.
Diagramă StreamingServlet
Figura 7: Diagrama StreamingServlet

Curgerea preţurilor codurilor mnemonice

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.

Diagrama TIckerSubscriber
Figura 8: Curgerea preţurilor codurilor mnemonice

Actualizarea 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.

Diagrama UpdateServlet
Figura 9: Cerere de actualizare cod mnemonic

Monitorizarea sănătăţii clientului

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.

Diagrama PingServlet
Figure 10: Monitor de sănătate Client

Curăţarea stării clientului

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.

Diagrama de curăţare client
Figura 11: Curăţare client

Client WebSphere Trader

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:

  1. Fluxul HTTP de instrucţiuni (URLSenderHandler) procesează toate informaţiile interactive, inclusiv logarea (LoginServlet), delogarea (LogoutServlet), mesajele de puls client (PingServlet) şi instrucţiuni de modificare simboluri (UpdateServlet).
  2. Fluxul HTTP streamer (StreamerHandler) procesează toate informaţiile de la servletul StreamingServlet, inclusiv actualizări de preţ, informaţii de stare server generare preţuri şi mesaje puls server curgere ticker.

Logarea la serverul curgere

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

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

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

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.

Diagrama Interacţiune aplet
Figura 12: Interacţiune aplet