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.

Špecifikácia


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:

  1. Vytvorenie konverzácie je riadené aplikačnou požiadavkou (volaním RPC procedúry). Tá vzniká medzi žiadateľom a entitou, ktorú táto požiadavka adresuje. Každá konverzácia je v ESL identifikovaná hodnotou typu INT (handle konverzácie). Táto hodnota je jedinečná v rámci inštancie eventu a nie je možné ju zdieľať medzi rôznymi inštanciami eventu alebo schém.
  2. Ukončenie konverzácie môže byť iniciované ľubovoľnou zúčastnenou entitou alebo automaticky systémom, ak došlo k zániku niektorej zo zúčastnených strán (strata komunikácie v dôsledku zlyhania komunikačných ciest, zatvorenie objektu, uloženie objektu (jeho konfigurácia) a následný refresh ....).

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

Používanie konverzácií
Príklad E.MAIL_SERVER