Instalacja BPEL... 1 Przykład połączenie z bazą danych... 2 Development... 2 Utwórz Aplikację i projekt o typie SOA... 2 Utwórz adapter do bazy danych... 4 Utwórz proces BPEL... 7 Połącz BPEL z adapterem bazy danych... 9 Deployment... 14 Testy... 16 Diagnostyka... 17 Konfiguracja połączenia z bazą danych na serwerze... 19 Konfiguracja połączenia z bazą danych na serwerze - Advanced queuing... 22 Konfiguracja połączenia z bazą danych na serwerze - MQ Series... 23 Restart serwera SOA... 24 Interfejsy do EBS... 25 Instalacja BPEL W BPEL programuje się np. w JDeveloper, z zainstalowanym składnikiem jak poniżej. BPEL nie generuje plików *.java, deplyment polega na przesłaniu plików projektu (XML) w odpowiednim standardzie.
Przykład połączenie z bazą danych Scenariusz: w bazie danych mamy procedurę, która dostaje na wejściu ID ( number ) i zwraca XMLa w formacie CLOB. Webservice ma pozwalać na podanie ID i zwracać XML. function CWF_XML_ALG ( p_id varchar2, p_range varchar2) return clob CREATE OR REPLACE function CWF_XML_ALG ( p_id varchar2, p_range varchar2) return clob is v_xml clob; procedure text(p_clob in out nocopy clob, p_text varchar2 ) is v_text varchar2(32000);begin v_text:=p_text chr(10);dbms_lob.writeappend(p_clob,length(v_text),v_text);end; procedure tag_text ( p_clob in out nocopy clob, p_tagname varchar2, p_text varchar2, p_tab int default 0)is v_text varchar2 (32000);begin v_text := lpad(chr(9),p_tab, chr (9)) '<' p_tagname '>' replace(replace(replace(replace(replace(p_text,'&','&'),'<','<'),'>','>'),'"','"'),'''',''') '</' p_tagname '>' chr(10);dbms_lob.writeapp end(p_clob,length(v_text),v_text);end; begin dbms_lob.createtemporary(v_xml, TRUE, DBMS_LOB.session); Cwf_Dossier_Gen.split(p_range); text(v_xml, '<?xml version="1.0" encoding="utf-8"?>'); text(v_xml, '<CWF_V_ALG_KREDYT xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://www.dossier.decisionmodule.dnbnord.org">'); for c0 in (select /*+ FIRST_ROWS */ ID,ELEMENT_ID,CDATA_ID,DATA_BROK,DECISION_ID,HIP_KAUC,HIP_ZWYK,KOSZTY_KLIENTA,KWOTA_EGZEKUCJI,KWOTA_KREDYTU,KWOTA_PRZYZNANA,LACZN_KWOTA_KOSZT_OPLAT,MARZA_NEGOCJOWANA,MARZA_PROMOCYJNA,MARZA _STANDARD,METODA_SPLATY_VCODE,METODA_SPLATY,METODA_SPLATY_CODE,OKRES_KARENCJI,OKRES_KREDYTOWANIA,OKRES_SPLATY_RZECZYWISTY,OPROCENTOWANIE,PODWYZSZENIE_PRZED_KW,POWIEKSZONA_RATA_PLN,POZOSTAL E_KOSZTY,PROWIZJA,RATA_POWIEKSZONA,RATA_RZECZYWISTA,RATA_SPREAD,ROZNICA_RATY,RRSO,SPOS_PLATN_SKLAD_DOCHODY_VCODE,SPOS_PLATN_SKLAD_DOCHODY,SPOS_PLATN_SKLAD_DOCHODY_CODE,SPOS_PLATN_SKLAD_ZYC IE_VCODE,SPOS_PLATN_SKLAD_ZYCIE,SPOS_PLATN_SKLAD_ZYCIE_CODE,WALUTA from CWF_V_ALG_KREDYT where '100' not in(select ID from CWF_D_DOSSIER_RANGE) and ID = p_id ) loop text(v_xml, '<CWF_V_ALG_KREDYT_ROW kod="100">'); tag_text(v_xml, 'ID', replace(rtrim(rtrim(to_char(c0.id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'ELEMENT_ID', replace(rtrim(rtrim(to_char(c0.element_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'CDATA_ID', replace(rtrim(rtrim(to_char(c0.cdata_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'DATA_BROK', TO_CHAR(c0.DATA_BROK, 'RRRR-MM-DD HH24:MI:SS')); tag_text(v_xml, 'DECISION_ID', replace(rtrim(rtrim(to_char(c0.decision_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'HIP_KAUC', replace(rtrim(rtrim(to_char(c0.hip_kauc, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'HIP_ZWYK', replace(rtrim(rtrim(to_char(c0.hip_zwyk, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KOSZTY_KLIENTA', replace(rtrim(rtrim(to_char(c0.koszty_klienta, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KWOTA_EGZEKUCJI', replace(rtrim(rtrim(to_char(c0.kwota_egzekucji, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KWOTA_KREDYTU', replace(rtrim(rtrim(to_char(c0.kwota_kredytu, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KWOTA_PRZYZNANA', replace(rtrim(rtrim(to_char(c0.kwota_przyznana, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'LACZN_KWOTA_KOSZT_OPLAT', replace(rtrim(rtrim(to_char(c0.laczn_kwota_koszt_oplat, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'MARZA_NEGOCJOWANA', replace(rtrim(rtrim(to_char(c0.marza_negocjowana, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'MARZA_PROMOCYJNA', replace(rtrim(rtrim(to_char(c0.marza_promocyjna, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'MARZA_STANDARD', replace(rtrim(rtrim(to_char(c0.marza_standard, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'METODA_SPLATY_VCODE', c0.metoda_splaty_vcode); tag_text(v_xml, 'METODA_SPLATY', c0.metoda_splaty); tag_text(v_xml, 'METODA_SPLATY_CODE', c0.metoda_splaty_code); tag_text(v_xml, 'OKRES_KARENCJI', replace(rtrim(rtrim(to_char(c0.okres_karencji, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'OKRES_KREDYTOWANIA', replace(rtrim(rtrim(to_char(c0.okres_kredytowania, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'OKRES_SPLATY_RZECZYWISTY', replace(rtrim(rtrim(to_char(c0.okres_splaty_rzeczywisty, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'OPROCENTOWANIE', replace(rtrim(rtrim(to_char(c0.oprocentowanie, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'PODWYZSZENIE_PRZED_KW', replace(rtrim(rtrim(to_char(c0.podwyzszenie_przed_kw, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'POWIEKSZONA_RATA_PLN', replace(rtrim(rtrim(to_char(c0.powiekszona_rata_pln, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'POZOSTALE_KOSZTY', replace(rtrim(rtrim(to_char(c0.pozostale_koszty, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'PROWIZJA', replace(rtrim(rtrim(to_char(c0.prowizja, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_POWIEKSZONA', replace(rtrim(rtrim(to_char(c0.rata_powiekszona, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_RZECZYWISTA', replace(rtrim(rtrim(to_char(c0.rata_rzeczywista, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_SPREAD', replace(rtrim(rtrim(to_char(c0.rata_spread, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'ROZNICA_RATY', replace(rtrim(rtrim(to_char(c0.roznica_raty, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RRSO', replace(rtrim(rtrim(to_char(c0.rrso, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'SPOS_PLATN_SKLAD_DOCHODY_VCODE', c0.spos_platn_sklad_dochody_vcode); tag_text(v_xml, 'SPOS_PLATN_SKLAD_DOCHODY', c0.spos_platn_sklad_dochody); tag_text(v_xml, 'SPOS_PLATN_SKLAD_DOCHODY_CODE', c0.spos_platn_sklad_dochody_code); tag_text(v_xml, 'SPOS_PLATN_SKLAD_ZYCIE_VCODE', c0.spos_platn_sklad_zycie_vcode); tag_text(v_xml, 'SPOS_PLATN_SKLAD_ZYCIE', c0.spos_platn_sklad_zycie); tag_text(v_xml, 'SPOS_PLATN_SKLAD_ZYCIE_CODE', c0.spos_platn_sklad_zycie_code); tag_text(v_xml, 'WALUTA', c0.waluta); text(v_xml, '<CWF_V_ALG_RATY kod="101">'); for c1 in (select /*+ FIRST_ROWS */ ID,APPLICATION_ID,CONTRACT_ID,KAPITAL_NIEWYMAGALNY_PLN,KAPITAL_NIEWYMAGALNY_WAL,KAPITAL_PO_SPLACIE_RATY_PLN,KAPITAL_PO_SPLACIE_RATY_WAL,NUMER_RATY,RATA_KAPITALOWA_PLN,RATA_KAPITALOWA_WAL,R ATA_ODSETKOWA_PLN,RATA_ODSETKOWA_WAL,RATA_PLN from CWF_V_ALG_RATY where '101' not in(select ID from CWF_D_DOSSIER_RANGE) and c0.id = APPLICATION_ID ) loop text(v_xml, '<CWF_V_ALG_RATY_ROW kod="101">'); tag_text(v_xml, 'ID', replace(rtrim(rtrim(to_char(c1.id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'APPLICATION_ID', replace(rtrim(rtrim(to_char(c1.application_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'CONTRACT_ID', replace(rtrim(rtrim(to_char(c1.contract_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KAPITAL_NIEWYMAGALNY_PLN', c1.kapital_niewymagalny_pln); tag_text(v_xml, 'KAPITAL_NIEWYMAGALNY_WAL', replace(rtrim(rtrim(to_char(c1.kapital_niewymagalny_wal, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'KAPITAL_PO_SPLACIE_RATY_PLN', c1.kapital_po_splacie_raty_pln); tag_text(v_xml, 'KAPITAL_PO_SPLACIE_RATY_WAL', replace(rtrim(rtrim(to_char(c1.kapital_po_splacie_raty_wal, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'NUMER_RATY', replace(rtrim(rtrim(to_char(c1.numer_raty, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_KAPITALOWA_PLN', replace(rtrim(rtrim(to_char(c1.rata_kapitalowa_pln, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_KAPITALOWA_WAL', replace(rtrim(rtrim(to_char(c1.rata_kapitalowa_wal, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_ODSETKOWA_PLN', replace(rtrim(rtrim(to_char(c1.rata_odsetkowa_pln, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_ODSETKOWA_WAL', replace(rtrim(rtrim(to_char(c1.rata_odsetkowa_wal, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'RATA_PLN', replace(rtrim(rtrim(to_char(c1.rata_pln, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); text(v_xml, '</CWF_V_ALG_RATY_ROW>'); end loop; text(v_xml, '</CWF_V_ALG_RATY>'); text(v_xml, '<CWF_V_ALG_UBEZPIECZENIA kod="102">'); for c1 in (select /*+ FIRST_ROWS */ ID,APPLICATION_ID,DATA_BROK,ELEMENT_ID,WARTOSC,TYP_UBEZP_VCODE,TYP_UBEZP,TYP_UBEZP_CODE from CWF_V_ALG_UBEZPIECZENIA where '102' not in(select ID from CWF_D_DOSSIER_RANGE) and c0.id = APPLICATION_ID ) loop text(v_xml, '<CWF_V_ALG_UBEZPIECZENIA_ROW kod="102">'); tag_text(v_xml, 'ID', replace(rtrim(rtrim(to_char(c1.id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'APPLICATION_ID', replace(rtrim(rtrim(to_char(c1.application_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'DATA_BROK', TO_CHAR(c1.DATA_BROK, 'RRRR-MM-DD HH24:MI:SS')); tag_text(v_xml, 'ELEMENT_ID', replace(rtrim(rtrim(to_char(c1.element_id, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'WARTOSC', replace(rtrim(rtrim(to_char(c1.wartosc, 'FM999999999999999999990D9999999999999999999' ), ','), '.'),',','.')); tag_text(v_xml, 'TYP_UBEZP_VCODE', c1.typ_ubezp_vcode); tag_text(v_xml, 'TYP_UBEZP', c1.typ_ubezp); tag_text(v_xml, 'TYP_UBEZP_CODE', c1.typ_ubezp_code); text(v_xml, '</CWF_V_ALG_UBEZPIECZENIA_ROW>'); end loop; text(v_xml, '</CWF_V_ALG_UBEZPIECZENIA>'); text(v_xml, '</CWF_V_ALG_KREDYT_ROW>'); end loop; text(v_xml, '</CWF_V_ALG_KREDYT>'); return v_xml; end; / Development Utwórz Aplikację i projekt o typie SOA
Wewnątrz aplikacji utwórz projekt o typie SOA projekt
Utwórz adapter do bazy danych
Podaj połączenie do bazy danych. Podczas testowania lokalnego istotne jest to co jest wpisane w polu connection. Po zdeployowaniu na serwer istotne jest to co się wpisze w pole JNDI Name. Zajrzyj do sekcji Konfiguracja połączenia z bazą danych na serwerze, żeby się dowiedzieć skąd pobrać JNDI Name.
Na tym ekranie zostawiamy wartości domyślne
W efekcie mamy gotowy adapter Utwórz proces BPEL Nasz BPEL ma zwracać XMLa, dlatego trzeba mu powiedzieć, jak ma ten XML wyglądać. Definicję zwracanego pliku XSD możemy utworzyć dowolnie ( w naszym przypadku została ona wygenerowana przez system dossier ) i umieszczamy ją w projekcie, np. przez skopiowanie pliku do projektu:
Po skopiowaniu i odświeżeniu plik pokazuje się tutaj. Zaraz go użyjemy definiując output dla BPEL.
Pamiętaj, żeby wybrać proces synchroniczny, nie jest potem łatwo zmienić proces asynchroniczny na synchroniczny, bo np. proces synchroniczny ma klocek proces synchroniczny callback. a Połącz BPEL z adapterem bazy danych
Po kliknięciu w zaznaczone elementy możesz sprawdzić jakie są parametry wejściowe i wyjściowe: Zbuduj wnętrze procesu BPEL. Z reguły do szkieletu trzeba dodać elementy: - assign: które przepisują zmienne wejściowe procesu do zmiennych wejściowych wywołania - invoke: wywołanie procedury PLSQL - assign: które przepisują zmienne wyjściowe procesu do zmiennych wyjściowych wywołania
Dodajemy klocki assign, invoke, assign Konfigurujemy invoke łączymy z MY_PROC i dodajemy zmienne wejściowe i wyjściowe
input i output musi być podany. Najprościej- kliknij w plusa i naciśnij OK., wówczas zmienna utworzy się automatycznie. Dopiero teraz konfigurujemy assign1 ( wcześniej nie mielibyśmy dostępnych w drzewku zmienny wejściowych i wyjściowych procedury PL/SQL ):
Łączymy zmienną procedury ze zmienną wej. procedury PL/SQL klikając w drzewko: Konfigurujemy assign2: Musimy skonwertować CLOB ( to zwraca PL/SQL ) na XML, do tego używamy funkcji ParseXML. Nie piszemy expression ręcznie, lecz klikamy myszą!
To wszystko. Jeżeli nie zniknęły wykrzykniki z ekranu, to naciśnij przycisk validate. Deployment
Możemy zdeplyować projekt na serwer zdalny lub serwer zintegrowany z jdeveloper.
Testy http://10.200.205.45:7011/em
Przeglądanie wyników Diagnostyka Można przeglądać graficznie proces bpel i wyniki wszystkich kroków procesu
Konfiguracja połączenia z bazą danych na serwerze http://10.200.205.45:7011/console/login/loginform.jsp
, gdzie cwdata to
Konfiguracja połączenia z bazą danych na serwerze - Advanced queuing (do tego źródła odwołuje się plik w BPEL, odwołanie jest w pliku XML) http://10.200.205.45:7011/console/console.portal?_nfpb=true&_pagelabel=appdeployments ControlPage
Konfiguracja połączenia z bazą danych na serwerze - MQ Series Analogicznie, deployment
Restart serwera SOA Stop: Metoda 1 Metoda 2 Czasami restart trzeba zrobić z poziomu skryptu, bo konsola nie działa: stopweblogic.cmd Metoda 3 Można też ubić wszystkie czarne okna na serwerze
Start: Uruchom w jednym oknie cmd: startweblogic_adm.cmd Uruchom w drugim oknie cmd: startweblogic_soa.cmd soa_server1 (trzeba uruchomić w drugim oknie, bo okno konsoli po uruchomieniu startweblogic_adm.cmd nie oddaje sterowania i wyświetla różne komunikaty) Interfejsy do EBS