【问题标题】:TCP transport in Proxy wso2 esb代理 wso2 esb 中的 TCP 传输
【发布时间】:2025-12-02 22:55:01
【问题描述】:

我想通过 TCP 传输向代理服务发送请求,当使用此代码发送我的肥皂 xml 时

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 引擎的 TCP 请求 {org.apache.axis2.transport.tcp.TCPWorker} org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException:非法处理指令 目标(“xml”); xml(不区分大小写)由规范保留。在 [行,列{未知来源}]:[2,5] 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 在 org.apache.axiom.om.impl.llom.OMDocumentImpl.buildNext(OMDocumentImpl.java:135) 在 org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122) 在 org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:343) 在 org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36) 在 org.apache.axiom.om.impl.traverse.OMAbstractIterator.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(DefaultLocationPath.java:140) 在 org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:113) 在 org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102) 在 org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:674) 在 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.synapse.mediators.builtin.PropertyMediator.getResultValue(PropertyMediator.java:299) 在 org.apache.synapse.mediators.builtin.PropertyMediator.mediate(PropertyMediator.java:95) 在 org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71) 在 org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114) 在 org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:154) 在 org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 在 org.apache.axis2.transport.tcp.TCPWorker.run(TCPWorker.java:68) 在 org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 原因:com.ctc.wstx.exc.WstxParsingException:非法处理指令 目标(“xml”); xml(不区分大小写)由规范保留。在 [行,列{未知来源}]:[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:2886) 在 com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2629) 在 com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1062) 在 org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) 在 org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34) 在 org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681) 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214) ... 25 更多

我使用在我的消息中附加 '\n', "\r\n" ,但没有一个能做到这一点。

我也尝试使用此链接中说明的方法。How to Send SOAP Messages Using TCP Transport 并且效果很好。

但我不能在我的项目中使用那种 api。我怎样才能摆脱这个问题。

【问题讨论】:

    标签: sockets tcp wso2 wso2esb


    【解决方案1】:

    我能够使用示例客户端向 ESB 发送 TCP 消息,但您必须确保发送的是 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();
        }
    }
    

    【讨论】: