[英]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.