代理 wso2 esb 中的 TCP 传输 [英] TCP transport in Proxy wso2 esb

查看:37
本文介绍了代理 wso2 esb 中的 TCP 传输的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to send a request over TCP transport to a proxy service, when use this code to send my soap xml

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

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

outToServer.writeBytes("soap xml instance");

clientSocket.close();

它运行良好,我的业务还在继续.

it works fine and my business is continues.

但是当我发送两个 xml 而不像这样关闭套接字时:

But when i send two xml without closing the socket like this:

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(不区分大小写)由规范保留.在[row,col {unknown-source}]: [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)在 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: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 个

TID: [0] [ESB] [2013-06-28 13:36:10,838] ERROR {org.apache.axis2.transport.tcp.TCPWorker} - Error while processing TCP request through the Axis2 engine {org.apache.axis2.transport.tcp.TCPWorker} org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs. at [row,col {unknown-source}]: [2,5] at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) at org.apache.axiom.om.impl.llom.OMDocumentImpl.buildNext(OMDocumentImpl.java:135) at org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122) at org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:343) at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36) at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58) at org.jaxen.util.DescendantAxisIterator.hasNext(DescendantAxisIterator.java:101) at org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:152) at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:140) at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:113) at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102) at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:674) at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:213) at org.jaxen.BaseXPath.evaluate(BaseXPath.java:172) at org.apache.synapse.util.xpath.SynapseXPath.stringValueOf(SynapseXPath.java:297) at org.apache.synapse.mediators.builtin.PropertyMediator.getResultValue(PropertyMediator.java:299) at org.apache.synapse.mediators.builtin.PropertyMediator.mediate(PropertyMediator.java:95) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114) at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:154) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.axis2.transport.tcp.TCPWorker.run(TCPWorker.java:68) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs. at [row,col {unknown-source}]: [2,5] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606) at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479) at com.ctc.wstx.sr.BasicStreamReader.readPIPrimary(BasicStreamReader.java:3903) at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2037) at com.ctc.wstx.sr.BasicStreamReader.closeContentTree(BasicStreamReader.java:2886) at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2629) at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1062) at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34) at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681) at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214) ... 25 more

我在我的消息中附加了 '\n'、"\r\n",但没有一个可以实现.

I used appending '\n', "\r\n" to my message but non of them make that work.

我也尝试使用此链接中说明的方法.如何使用 TCP 传输发送 SOAP 消息,效果很好.

Also i tried that used the method that explined in this link.How to Send SOAP Messages Using TCP Transport and it worked fine.

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

But i could not use that kind of api in my project. How can i get rid of this problem.

推荐答案

我能够使用示例客户端向 ESB 发送 TCP 消息,但您必须确保发送的是 XML 元素.

I was able to send TCP messages to ESB using a sample client but you have to make sure you send an XML element.

首先确保您已在axis2.xml (repository/conf/axis2/axis2.xml) 中为tcp 启用传输接收器

First make sure you have enabled transport reciver for tcp in axis2.xml (repository/conf/axis2/axis2.xml)

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

======================我的代理服务,它接收 TCP 消息 ============

========================My Proxy Service which recives TCP messages ===========

<?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 服务器发送消息的客户端 ====

==Client that send messages to TCP server ====

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

这篇关于代理 wso2 esb 中的 TCP 传输的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆