Procedury ABL i serwer aplikacji PAS cz.I
Od kilku miesięcy informujemy o nowych możliwościach serwera aplikacji PAS. Pytanie co z uruchamianiem procedur ABL, które działały do tej pory na klasycznym AppSerwerze? Czy trzeba je modyfikować? Czy migracja jest trudna dla przeciętnego programisty? Na te i podobne pytania postaram się odpowiedzieć w tym i następnym artykule.
Zacznijmy od uruchomienia instancji serwera aplikacji PAS o nazwie oepas1 (podobnie jak w poprzednich artykułach).
Przypominam, że PAS jest podłączony do bazy sportsdb, a w PROPATH znajduje się podkatalog openedge, do którego skopiujemy procedury abl (patrz poniżej).
Do uruchamiania procedur openedge potrzebny jest aktywny adapter, obsługujący warstwę transportową apsv. Sprawdzamy czy jest on aktywny w OpenEdge Explorerze lub wpisując w przeglądarce url: localhost:[port]/apsv. Jak widać poniżej adapter jest aktywny.
Teraz możemy uruchomić na kliencie program podłączający się do serwera aplikacji i uruchamiający tę samą procedurę FindCustomerByName, którą uruchamialiśmy dla web serwisów SOAP.
Najpierw zrobimy to dla modelu SESSION-FREE.
/* SESSION-FREE */ DEFINE VARIABLE hServer AS HANDLE NO-UNDO. DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO. DEFINE VARIABLE CustomerNumber AS CHARACTER NO-UNDO. CREATE SERVER hServer. lReturn = hServer:CONNECT("-URL http://localhost:8810/apsv -sessionModel Session-free"). IF NOT lReturn THEN DO: DELETE OBJECT hServer NO-ERROR. RETURN ERROR "Failed to connect to the ABL web application: " + RETURN-VALUE. END. RUN FindCustomerByName ON hServer (INPUT "Lift Tours", INPUT-OUTPUT CustomerNumber). MESSAGE CustomerNumber VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. lReturn = hServer:DISCONNECT(). DELETE OBJECT hServer NO-ERROR.
Kod podłączenia i uruchomienia procedury jest bardzo podobny jak dla klasycznego AppServera.
W OpenEdge Explorerze w widoku Sessions widać otwartą sesję ze stanem Unbound (Bound=false), czyli sesja agenta nie jest powiązana z klientem.
Kod dla podłączenia w modelu SESSION-MANAGED różni się tylko dla metody CONNECT. Jego działanie jest identyczne jak w powyższym przykładzie.
/* SESSION-MANAGED */ DEFINE VARIABLE hServer AS HANDLE NO-UNDO. DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO. DEFINE VARIABLE CustomerNumber AS CHARACTER NO-UNDO. CREATE SERVER hServer. lReturn = hServer:CONNECT ("-URL http://localhost:8810/apsv","",""). IF NOT lReturn THEN DO: DELETE OBJECT hServer NO-ERROR. RETURN ERROR "Failed to connect to the ABL web application: " + RETURN-VALUE. END. RUN FindCustomerByName ON hServer (INPUT "Lift Tours", INPUT-OUTPUT CustomerNumber). MESSAGE CustomerNumber VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. lReturn = hServer:DISCONNECT(). DELETE OBJECT hServer NO-ERROR.
Ponieważ uruchomiłem 3 takie same programy na kliencie, to w widoku Agents mam co prawda dalej tylko jednego agenta, ale 3 jego sesje.
Żeby powiązać daną sesję agenta z klientem stosujemy tę samą sztuczkę jak w przypadku klasycznego AppSerwera: w procedurze uruchamianej na serwerze aplikacji dodajemy komendę:
SESSION:SERVER-CONNECTION-BOUND-REQUEST = TRUE.
Powiązanie stosuje się aby łatwiej zarządzać kontekstem, gdyż ta sama sesja agenta może obsłużyć kilka/wiele żądań pomiędzy aplikacją kliencką a daną sesją. Zwolnienie sesji odbywa się zazwyczaj przez uruchomienie tej samej komendy z wartością FALSE. Poniżej, w widoku Sessions widać 3 sesje ze stanem Bound (Bound=true).
Ciąg dalszy niebawem w drugiej cześci…