簡體   English   中英

調用前如何檢查Java Web服務是否已在PL / SQL中啟動並運行

[英]How to Check if a java web service is up and running in PL/SQL before calling it

我有一個調用Java Web服務的PL / SQL函數。 我們在2台不同的機器上都有此Java Web服務。 讓我們將它們分別稱為03和04。在兩台不同的計算機上使用相同的完全Web服務,以防萬一其中一台宕機。

現在,我已經將PL / SQL函數中的SOAP URL硬編碼為始終調用03。 但是我想做的是檢查03是否啟動並運行,然后繼續調用它,否則檢查並調用04。如果它們都關閉,則返回錯誤狀態,例如,兩個服務器都關閉了。

這是我的PL / SQL功能代碼:

        create or replace FUNCTION          "CALL_IPVFBJAVA_WEBSERVICE" (JobID NUMBER) RETURN INT IS

        --//URL CALL
        SOAP_URL CONSTANT VARCHAR2(1000) := 'http://cdt0rwlm03.dev.gov:9001/mappownblahblah?wsdl';

        SOAP_ENVELOPE CONSTANT VARCHAR2(2000) := 
        '<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://blahblah">
           <env:Header/>
           <env:Body>
              <ns1:runSeriatimValuation>
                 <arg0>$JobID</arg0>
                 <arg1>$JobID</arg1>
              </ns1:runSeriatimValuation>
           </env:Body>
        </env:Envelope>';

        --//LOCAL VARIABLES
        SOAPENVELOPE VARCHAR2(2000);
        v_Return NUMBER(1);
        REQUEST UTL_HTTP.REQ;
        RESPONSE UTL_HTTP.RESP;
        BUFFER VARCHAR2(32767);
        SOAPRESPONSE CLOB;
        XMLRESPONSE XMLTYPE;
        EOF BOOLEAN;

        BEGIN
            --// CREATE THE SOAP ENVELOPE
            SOAPENVELOPE := REPLACE(SOAP_ENVELOPE, '$JobID', JobID);

            --// MAKE THE POST CALL TO THE WEB SERVICE
            UTL_HTTP.SET_TRANSFER_TIMEOUT(3600);
            REQUEST := UTL_HTTP.BEGIN_REQUEST(SOAP_URL, 'POST', UTL_HTTP.HTTP_VERSION_1_1);
            UTL_HTTP.SET_HEADER (REQUEST, 'Content-Type', 'text/xml; charset=utf-8');
            UTL_HTTP.SET_HEADER (REQUEST, 'Content-Length', LENGTH(SOAPENVELOPE));
            UTL_HTTP.SET_HEADER (REQUEST, 'SoapAction', '');
            UTL_HTTP.WRITE_TEXT (REQUEST, SOAPENVELOPE);

            --// READ THE WEB SERVICE HTTP RESPONSE
            RESPONSE := UTL_HTTP.GET_RESPONSE(REQUEST);
            DBMS_LOB.CREATETEMPORARY(SOAPRESPONSE, TRUE);
            EOF := FALSE;

            LOOP
                EXIT WHEN EOF;
                BEGIN
                    UTL_HTTP.READ_LINE(RESPONSE, BUFFER, TRUE);
                    IF LENGTH(BUFFER) > 0 THEN
                        DBMS_LOB.WRITEAPPEND(SOAPRESPONSE, LENGTH(BUFFER), BUFFER);
                    END IF;
                    EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN 
                    EOF := TRUE;
                END;
            END LOOP;
            UTL_HTTP.END_RESPONSE(RESPONSE);

          --// AS THE SOAP RESPONDS WITH XML, WE CONVERT THE RESPONSE TO XML
            XMLRESPONSE := XMLTYPE(SOAPRESPONSE);
            DBMS_LOB.FREETEMPORARY(SOAPRESPONSE);
          v_Return := TO_NUMBER(XMLRESPONSE.EXTRACT('//result/text()').getStringVal());
          --// DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
          RETURN(v_Return);

        EXCEPTION WHEN OTHERS THEN
            IF SOAPRESPONSE IS NOT NULL THEN
            DBMS_LOB.FREETEMPORARY(SOAPRESPONSE);
            END IF;
            RAISE;

        END CALL_IPVFBJAVA_WEBSERVICE;

提前致謝,

由於使用的是PLSQL,因此始終可以將值存儲在較小的配置表中。 就像是...

CREATE TABLE ENDPOINT_PRIORITY
(ENDPOINT_URL  VARCHAR2(100),
 STATUS        VARCHAR2(30),
 PRIORITY      NUMBER);

編寫一個實用程序函數,該函數可以使用簡單的HTTP請求快速檢查每個端點的狀態,相應地更新表中的記錄,最后返回URL或引發異常。

如果由於記錄鎖定和上下文切換而每分鍾多次調用此函數,則將出現性能問題,但是,如果Web服務調用是同步的,則還可以在會話內實現內存緩存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM