Na systémovej úrovni je v D2000 podporený mechanizmus, ktorý umožňuje vytvoriť konverzáciu medzi dvoma "skriptovateľnými" a zároveň "adresovateľnými" entitami v aplikácii.
V praxi je výhodné použiť konverzácie všade tam, kde na aplikačnej úrovni vzniká nejaká relácia (alebo väzba) medzi inštanciami ESL skriptov alebo procesom implementovaným prostredníctvom D2000 JAPI. V prípade, že takéto väzby sú realizované prostredníctvom konverzácie, je možné na aplikačnej úrovni jednoducho ošetriť stav, kedy "druhá strana" tejto relácie prestane existovať.
Napríklad:
Prostredníctvom server eventu E.MAIL_SERVER sa implementuje služba, ktorá umožní klientom (iným server eventom, schémam alebo procesu D2000 JAPI) pripojiť sa k odberu správ. Toto pripojenie sa realizuje napríklad metódou:
RPC PROCEDURE Attach .... END Attach |
Príslušný klient sa prihlási k odberu správ jej zavolaním:
CALL [E.MAIL_SERVER] Attach ON SELF.EVH |
E.MAIL_SERVER implementuje ďalšiu službu, ktorá umožní poslať správu prihláseným klientom:
RPC PROCEDURE Send(IN TEXT _msg) ... END Send |
Pri zániku klienta je tento povinný sa odregistrovať volaním metódy:
RPC PROCEDURE Detach .... END Detach |
Všetko funguje dobre až do okamihu, kedy klient, ktorý zaniká, nestihne zavolať metódu
Detach a tým spôsobí, že služba E.MAIL_SERVER sa nedozvie o tom, že daný klient už neexistuje.
Druhá možná chyba je tá, že ak sa služba E.MAIL_SERVER z nejakého dôvodu reinicializuje (reštart procesu, uloženie novej verzie služby ....), žiadny klient sa nedozvie o tom, že je potrebné sa znovu zaregistrovať volaním metódy
Attach.
Prostredníctvom konverzácií je možné ošetriť práve tieto problematické prípady.
Zoznam entít, ktoré sa môžu zúčastniť na konverzácii:
Konverzácia je jedinečná relácia medzi entitami a slúži ako prostriedok (alebo transportná vrstva) pre ich vzájomnú asynchrónnu procedurálnu komunikáciu (volaním RPC procedúr a metód rozhraní, ktoré implementujú), pričom zohľadňuje ich životný cyklus. V praxi to znamená, že:
Vytvorenie konverzácie, zasielanie správ a jej ukončenie je realizované prostredníctvom volaní RPC procedúr. Obsluha neočakávaného prerušenia transakcie je realizovaná volaním RPC procedúry skriptu, ktorý je zúčastnený transakcie.
Za týmto účelom je rozšírená syntax deklarácie RPC procedúr.
RPC PROCEDURE [_hTC, TC_B] NewTransaction(parameters) RPC PROCEDURE [_hTC, TC_E] EndTransaction(parameters) RPC PROCEDURE [_hTC, TC_BE] QuestionTransaction(parameters) RPC PROCEDURE [_hTC, TC_C] UserProc(parameters) RPC PROCEDURE [_hTC, ERROR] TransactionInterrupted |
Premenná _hTC je použitá pre identifikáciu konverzácie (množstvo konverzácií nie je obmedzené). V rámci obsluhy procedúry je vždy automaticky deklarovaná ako lokálna premenná typu IN INT.
Rozšírená syntax pre volanie procedúr.
CALL [objIdent] NewConversation(parameters) ASYNC ... TC_B _hTC CALL [_hTC] EndConversation(parameters) ASYNC ... TC_E CALL [objIdent] QuestionConversation(parameters) ASYNC ... TC_BE _hTC CALL [_hTC] UserProc(parameters) ASYNC TC_C |
Premenná _hTC je výstupná v kontexte akcií TC_B a TC_BE a vstupná v kontexte akcií TC_C a TC_E. Všetky volania sú zásadne asynchrónne.
Kľúčové slová TC_B, TC_E, TC_BE, ERROR sú použité pre procedúry, ktoré sa zúčastňujú na riadení životného cyklu konverzácie (obsluhujú alebo iniciujú udalosti, ktoré menia jej stav). Prostredníctvom kľúčového slova TC_C označujeme volanie, ktoré nemení stav konverzácie.
Procedúra UserProc je užívateľsky definovaná procedúra, ktorá slúži na prenos správ v rámci konverzácie bez zmeny jej stavu. Meno procedúry je vo všetkých prípadoch definované užívateľom. V prípade volania procedúry ESL Interface, ktorý implementuje ESL skript, platí popísaná syntax.
Pre volanie procedúry, ktorú implementuje proces, je syntax nasledovná:
CALL [(0)] I.Interface^ProcName(parameters) ON ProcesName.EXT |
0 – je hodnota nula