2013-02-25 120 views
1

我嘗試從Oracle過程(PL/SQL)向WSO2 ESB發送JSON消息。 所以, 我創建的存儲過程TEST_JSON如下:wso2 esb,json,PL/SQL將JSON Web服務發送到WSO2 ESB代理服務,客戶端關閉連接

create or replace PROCEDURE test_json 
AS 
    http_resp utl_http.resp; 
    req_msg  CLOB; 
    resp_msg  CLOB; 
    TYPE tab_type IS TABLE OF PNLM%ROWTYPE; 
    t_tab tab_type := tab_type(); 
    v_parser  dbms_xmlparser.parser; 
    v_xmldoc  XMLDOM.DOMDocument; 
    v_node  dbms_xmldom.DOMNode; 
    v_item  dbms_xmldom.domnodelist; 
    v_n   dbms_xmldom.DOMNode; 
    l_pstatus varchar2(20); 
    v_clob_length binary_integer; 
    v_amount  pls_integer := 16383; 
    v_offset  pls_integer := 1; 
    v_buffer  varchar2(32767); 

    json_msg  CLOB; 
BEGIN 
    json_msg := '{"loc":{"longitude":"30.5","latitude":"20.5"}}'; 

    http_req := utl_http.begin_request('http://test.esb:8280/services/test_json', 'POST'); 
    utl_http.set_body_charset(http_req, 'UTF-8'); 
    utl_http.set_header(http_req, 'Content-Type', 'application/json'); 

    v_clob_length := dbms_lob.getLength(json_msg); 
    if v_clob_length <= 32767 then 
    utl_http.write_text(http_req, dbms_lob.substr(json_msg,dbms_lob.getLength(json_msg),1)); 
    elsif v_clob_length > 32767 then 
    while (v_offset < v_clob_length) loop 
     dbms_lob.read(lob_loc => json_msg,amount => v_amount,offset => v_offset,buffer => v_buffer); 
     utl_http.write_text(http_req, v_buffer); 
     v_offset := v_offset + v_amount; 
    end loop; 
    end if; 

http_resp := utl_http.get_response(http_req); 
utl_http.read_text(http_resp, resp_msg); 
dbms_output.put_line(resp_msg); 
v_parser := dbms_xmlparser.newParser; 
dbms_xmlparser.setValidationMode(v_parser, FALSE); 
dbms_xmlparser.parseCLOB(v_parser, resp_msg); 
v_xmldoc := dbms_xmlparser.getDocument(v_parser); 
dbms_xmlparser.freeParser(v_parser); 
v_node := xmldom.makenode(v_xmldoc); 
v_item := dbms_xslprocessor.selectNodes(v_node,'//ts_state'); 
t_tab.EXTEND; 
v_n := dbms_xmldom.item(v_item, 0); 
dbms_xslprocessor.valueOf(v_n, '//ts_state', l_pstatus); 
dbms_output.put_line('l_pstatus=['||l_pstatus||']'); 
utl_http.end_response(http_resp); 

exception when utl_http.end_of_body then utl_http.end_response(http_resp); 
when utl_http.request_failed then dbms_output.put_line('Response Failed.'); utl_http.end_response(http_resp); 
when others then dbms_output.put_line('Unknown Error!.'); utl_http.end_response(http_resp); 
END; 

和創建WSO2 ESB代理服務TEST_JSON(下面含量在中-sequenc OFR代理服務TEST_JSON):

<proxy xmlns="http://ws.apache.org/ns/synapse" name="test_json" transports="https,http" statistics="disable" trace="disable" startOnLoad="true"> 
    <target> 
     <inSequence> 
     <clone continueParent="true" id="clon1" sequential="true"> 
      <target> 
       <sequence> 
        <log level="full"> 
        <property name="text" value="==========in clone=========="/> 
        </log> 
        <property name="longitude" expression="//longitude/text()" scope="default" type="STRING"/> 
        <property name="latitude" expression="//latitude/text()" scope="default" type="STRING"/> 
        <log level="custom"> 
        <property name="LONGITUDE" expression="get-property('longitude')"/> 
        <property name="LATITUDE" expression="get-property('latitude')"/> 
        </log> 
       </sequence> 
      </target> 
     </clone> 
     <header name="To" action="remove"/> 
     <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
     <property name="RESPONSE" value="true" scope="default"/> 
     <property name="DISABLE_CHUNKING" value="true" scope="axis2"/> 
     <send/> 
     <log level="full"> 
      <property name="text" value="==============End=============="/> 
     </log> 
     </inSequence> 
    </target> 
    <description></description> 
</proxy> 

但是,Oracle過程始終會超時(ORA-29276:傳輸超時), 儘管WSO2 ESB會收到消息(在ESB控制檯後顯示日誌中介消息由客戶關閉)。

當我由捲曲發送JSON消息:

curl -i \ 
-H "Content-Type: application/json" \ 
-X POST \ 
-d '{"loc":{"longitude":"30.5","latitude":"20.5"}}' \ 
http://test.esb:8280/services/test_json 

這是響應很快。

任何人都可以幫助嗎?謝謝。

回答

1

我找到點,設置「傳輸編碼」爲「分塊」, 添加一行utl_http.begin_request後,

utl_http.set_header(http_req, 'Transfer-Encoding', 'chunked');