1

Oracle プロシージャ (PL/SQL) から WSO2 ESB に JSON メッセージを送信しようとしています。そこで、 ストアド プロシージャ TEST_JSON を次のように作成しました。

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 を作成しました(以下、プロキシ サービス 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>

ただし、WSO2 ESB はメッセージ (クライアントによって接続が閉じられた後、ESB コンソールに表示されるログ メディエーター メッセージ) を受け取りますが、Oracle プロシージャは常にタイムアウトになります (ORA-29276: 転送タイムアウト)。

JSONメッセージをcURLで送信すると:</p>

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

早速の対応です。

誰でもそれを助けることができますか? ありがとう。

4

1 に答える 1

1

ポイントを見つけて、「Transfer-Encoding」を「chunked」に設定し、utl_http.begin_request の後に次の行を追加します。

utl_http.set_header(http_req, 'Transfer-Encoding', 'chunked' );
于 2013-02-26T08:57:52.107 に答える