piątek, stycznia 14, 2011

Adapter Tibco SAP R3 outbound

Adapter jest napisany w C++ i korzysta z natywnych bibliotek SAP. Tibco Designer używa bibliotek Javy SAP JCO opakowujących implementację w C. Adapter implementuje RFC Server, który woła funkcję RfcAccept (podłączenie się do danej instancji SAP-a, parametrem jest gateway i program ID) a następnie w pętli nieskończonej woła RfcListen (sprawdza czy jest nowe żądanie lub odpowiedź, nie czeka) oraz ewentualnie RfcDispatch (dokonuje obsługi żądania). Funkcje outboundowe SAP są dynamicznie rejrestrowane poprzez RfcInstallFunction ze wspólnym handlerem wywoływanym wewnętrznie przez RfcDispatch. Handler to funkcja typu callback. Obsługa wywołań w adapterze jest w praktyce blokująca mimo, że własne RFC_HANDLE jest podawane handlerowi jako parametr wejściowy i tylko RfcListen, RfcDispatch, RfcGetData, RfcSendData są wzajemnie blokujące. Handler rozpoznaje typ funkcji po jej nazwie uzyskanej z RfcGetName. Serwer RFC obsługuje wiele wywołań na jednym połączeniu na zasadzie multipleksera. Handler pobiera dane żądania za pomocą RfcGetData a odsyła odpowiedź poprzez RfcSendData - funkcje obsługują wielowątkowość. W trakcie wywołań RfcDispatch/RfcGetName biblioteka RFC sama nawiązuje ewentualne ponowne połączenie z rejestracją Program ID włącznie, ponieważ po każdym obsłużeniu żądania powinno zostać wywołane RfcClose. Użycie RfcDisplatch i RfcGetName naraz jest dyskusyjne.

Serwer RFC może zarejestrować się pod tym samym Program ID wielokrotnie, żądanie z SAP-a zostanie wysłane do jednej z instancji. Jeśli serwer RFC nie zamknie w czysty sposób połączenia (RfcClose) a przerwaniu ulegnie komunikacja TCP/IP (np. firewall nie dopuszcza połączeń długo będących w stanie idle) połączenie po stronie SAP-a będzie widoczne w stanie WAITING. Standardowo co 300 sekund między SAP-em a serwerem RFC następuje komunikacja keep-alive. Czas ten można skrócić za pomocą zmiennej środowiskowej RFC_MAX_REG_IDLE. Jeśli czas pomiędzy wywołaniami RfcListen jest zbyt duży, to od strony SAP-a będzie to wyglądać jako niedostępność adaptera outbound.

Żeby zobaczyć co się dzieje w środku można ustawić zmienne środowiskowe RFC_TRACE, RFC_DEBUG, RFC_SAFE_MODE na 1. Przydatne są też: CPIC_MAX_CONV (Connection Pool - Internal Connection - Max Connections Value), CPIC_TRACE.

0 komentarze: