簡體   English   中英

代理wso2 esb中的TCP傳輸

[英]TCP transport in Proxy wso2 esb

當使用此代碼發送我的soap xml時,我想通過TCP傳輸將請求發送到代理服務

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

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

outToServer.writeBytes("soap xml instance");

clientSocket.close();

它工作正常,我的生意還在繼續。

但是當我發送兩個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請求時出錯org.apache.axiom.om.OMException:com.ctc.wstx.exc.WstxParsingException:非法處理指令目標(“ xml”); xml(不區分大小寫)由規范保留。 在[row,col {unknown-source}]:在org.apache.axiom.om.impl上的[2,5]在org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 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.OMChildrenIterator.getNextNode(OMChildrenItom.java:36)上的.getNextOMSibling(OMElementImpl.java:343)org.apache.axiom.om.impl.traverse.OMAbstract中的OMAbstractrenerator.hasNext(OMAbstractIterator .java:58)位於org.jaxen.util.DescendantAxisIterator.hasNext(DescendantAxisIterator.java:101)位於org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:152)位於org.jaxen.expr.DefaultLocationPath.evaluate( org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:113)處的DefaultLocationPath.java:140)org.jaxen.BaseXPath.selectNodesForContext(BaseXPath)處的org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102)處的DefaultLocationPath.java:140)的.java:6 74)在org.jaxen.BaseXPath.selectNodes(BaseXPath.java:213)在org.jaxen.BaseXPath.evaluate(BaseXPath.java:172)在org.apache.synapse.util.xpath.SynapseXPath.stringValueOf(SynapseXPath.java :297),位於org.apache的org.apache.synapse.mediators.builtin.PropertyMediator.mediate(PropertyMediator.java:95)的org.apache.synapse.mediators.builtin.PropertyMediator.getResultValue(PropertyMediator.java:299)處。 org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114)上的synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)在org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive( org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)在org.apache.axis2.transport.tcp.TCPWorker.run(TCPWorker.java:68)處的ProxyServiceMessageReceiver.java:154) java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)上的.axis2.transport.base.threads.NativeWorkerPool $ 1.run(NativeWorkerPool.java:172) java.lang.Thread.run(Thread.java:662)上的ncurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)原因:com.ctc.wstx.exc.WstxParsingException:非法處理指令目標(“ xml” ); xml(不區分大小寫)由規范保留。 在[row,col {unknown-source}]:在com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)的com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner)的[2,5] .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.nextFromTree(BasicStreamReader.java:2629)上的sr.BasicStreamReader.closeContentTree(BasicStreamReader.java:2886)com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java)在org.apache.axiom.util.stax.dialect.Disallow。位於org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)的.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) rg.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)...還有25個

我曾在郵件中附加“ \\ n”,“ \\ r \\ n”,但沒有一個使之起作用。

我也嘗試過使用此鏈接中闡述的方法。 如何使用TCP傳輸發送SOAP消息 ,效果很好。

但是我無法在我的項目中使用這種api。 我如何擺脫這個問題。

我能夠使用示例客戶端將TCP消息發送到ESB,但是您必須確保發送XML元素。

首先,請確保已在axis2.xml(repository / conf / axis2 / axis2.xml)中為tcp啟用了傳輸接收器

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

========================我的代理服務接收TCP消息===========

<?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();
    }
}

暫無
暫無

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

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