2

このコードを使用して SOAP xml を送信するときに、TCP トランスポート経由でプロキシ サービスにリクエストを送信したい

Socket clientSocket = new Socket("host", port);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

outToServer.writeBytes("soap xml instance");

clientSocket.close();

それは正常に動作し、私のビジネスは継続しています。

しかし、次のようにソケットを閉じずに2つのxmlを送信すると:

Socket clientSocket = new Socket("host", port);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

outToServer.writeBytes("soap xml instance");

outToServer.writeBytes("another soap instance");

clientSocket.close();

常に次の例外をスローします。

TID: [0] [ESB] [2013-06-28 13:36:10,838] エラー {org.apache.axis2.transport.tcp.TCPWorker} - Axis2 エンジン {org.apache.axis2 を介した TCP 要求の処理中にエラーが発生しました.transport.tcp.TCPWorker} org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: 不正な処理命令ターゲット ("xml"); xml (大文字と小文字を区別しない) は、仕様によって予約されています。[row,col {unknown-source}]: [2,5] org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) at org.apache.axiom.om.impl org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122) の .llom.OMDocumentImpl.buildNext(OMDocumentImpl.java:135) org.apache.axiom.om.impl.llom.OMElementImpl のorg.apache.axiom.om.impl.traverse の .getNextOMSibling(OMElementImpl.java:343)。java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) java.lang.Thread.run(Thread.java:662) で 原因: com .ctc.wstx.exc.WstxParsingException: 不正な処理命令ターゲット ("xml"); xml (大文字と小文字を区別しない) は、仕様によって予約されています。[row,col {unknown-source}]: [2,5] com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606) com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner) .java:479) com.ctc.wstx.sr.BasicStreamReader.readPIPrimary(BasicStreamReader.java:3903) com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2037) com.ctc.wstx. sr.BasicStreamReader.closeContentTree(BasicStreamReader.java:

メッセージに「\n」、「\r\n」を追加しましたが、どれも機能しませんでした。

また、このリンクで説明されている方法を使用してみました。TCPトランスポートを使用してSOAPメッセージを送信する方法とそれはうまくいきました。

しかし、私のプロジェクトではその種の API を使用できませんでした。どうすればこの問題を解決できますか。

4

1 に答える 1

1

サンプル クライアントを使用して ESB に TCP メッセージを送信できましたが、必ず XML 要素を送信する必要があります。

まず、axis2.xml (repository/conf/axis2/axis2.xml) で tcp のトランスポート レシーバーが有効になっていることを確認します。

<transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportListener" >

========================TCPメッセージを受け取るMy Proxy Service ===========

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TCPProxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full"/>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
   </target>
   <parameter name="transport.tcp.port">6789</parameter>
   <parameter name="transport.tcp.contentType">application/xml</parameter>
   <description/>
</proxy>

==TCP サーバーにメッセージを送信するクライアント ====

import java.io.*;
import java.net.*;

class TCPClient {
    String host = "localhost";
    int port = 6789;
    Socket socket = null;
    public static void main(String args[]) throws Exception{
        String name ="Amani";
        TCPClient client = new TCPClient();
        String message = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +  
        "<soapenv:Header/>\n" +
        "<soapenv:Body>\n" +
        "  <p:greet xmlns:p=\"http://greet.service.amani.org\">\n" + 
        "     <in>" + name + "</in>\n" +
        "  </p:greet>\n" +
        "</soapenv:Body>\n" +
        "</soapenv:Envelope>";
        client.SendToServer("<test></test>");
        client.close();
    }

    TCPClient(String _host, int _port) throws Exception{
        host = _host;
        port = _port;
        socket = new Socket(host, port);
    }
    TCPClient() throws Exception{
        socket = new Socket(host, port);
    }
    void SendToServer(String msg) throws Exception{
        //create output stream attached to socket
        PrintWriter outToServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        //send msg to server
        outToServer.print(msg + '\n');
        outToServer.flush();
    }
    String RecieveFromServer() throws Exception{
        //create input stream attached to socket
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader (socket.getInputStream()));
        //read line from server
        String res = inFromServer.readLine(); // if connection closes on server end, this throws java.net.SocketException 
        return res;
    }
    void close() throws IOException{
        socket.close();
    }
}
于 2013-09-24T05:36:19.070 に答える