为什么在WSO2 ESB应用程序中执行大量HTTP POST请求(针对web服务)时会遇到这些问题?

为什么在WSO2 ESB应用程序中执行大量HTTP POST请求(针对web服务)时会遇到这些问题?,wso2,wso2esb,esb,wso2dss,Wso2,Wso2esb,Esb,Wso2dss,我是WSO2的新手,我有以下问题 我正在开发一个ESB应用程序,实现以下任务: 在本地数据库上执行一些DSS查询 使用检索到的数据构建一些XML文档 将所有这些文档发送到远程web服务(用PHP实现) 获取web服务响应(包含这些生成的XML文档之一的所有请求的特定响应),并使用其内容在以前的本地数据库上存储值 接收XML文档中包含的上一个请求的web服务将文档内容存储在另一个数据库中 我已经实现了这个ESB应用程序,它似乎可以使用以下逻辑工作(但我发现了一些问题,稍后将解释): 我已经创建了一

我是WSO2的新手,我有以下问题

我正在开发一个ESB应用程序,实现以下任务:

  • 在本地数据库上执行一些DSS查询
  • 使用检索到的数据构建一些XML文档
  • 将所有这些文档发送到远程web服务(用PHP实现)
  • 获取web服务响应(包含这些生成的XML文档之一的所有请求的特定响应),并使用其内容在以前的本地数据库上存储值
  • 接收XML文档中包含的上一个请求的web服务将文档内容存储在另一个数据库中

    我已经实现了这个ESB应用程序,它似乎可以使用以下逻辑工作(但我发现了一些问题,稍后将解释):

    我已经创建了一个API,其中按顺序包含一个,用于执行查询、构建XML文档、将这些文档发送到web服务,类似这样的内容(我无法发布整个代码,因为XML创建逻辑非常大):

    
    
    callout中介用于获取调用执行查询以获取数据的DSS服务

    现在在本节代码中:

    <!-- Iterate throug samples -->
    <iterate expression="$body//ds:Sample" id="ITR_AGG" xmlns:ds="http://ws.wso2.org/dataservice">
        <target sequence="sampleDataSequence"/>
    </iterate>
    
    
    
    我对每个检索到的元素进行迭代,对于每个元素,我将基本上构建一个XML,并将其发送到远程web服务。所有这些逻辑(相当大,因为XML文档包含许多字段)都包含在sampleDataSequence序列中(该序列将在每次迭代时执行,以构建和发送XML文档)

    我没有附加整个代码,在sampleDataSequence序列的末尾,我执行web服务调用(一个POST请求),将当前XML文档(在当前迭代中生成)传递给它,这样做(之前我将当前XML文档放在body请求中):

    
    
    因此,对于每个迭代,我构建一个全新的XML文档,并将其发送到我的web服务(这样,web服务接收它)

    因此,in sequence结束,然后是out sequence,它接收并收集所有web服务响应,然后它可以逐个解析这些响应,并将记录写入本地数据库上的result表中

    我是这样做的:

    <?xml version="1.0" encoding="UTF-8"?>
    <sequence name="glisOutSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
        <aggregate id="ITR_AGG">
            <completeCondition>
                <messageCount max="-1" min="-1"/>
            </completeCondition>
            <onComplete expression="s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1]" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s12="http://www.w3.org/2003/05/soap-envelope">
                <property name="it_count" scope="operation" type="STRING" value="0"/>
                <!-- Iterate over responses. For correct count calculations they should 
                    be sequential -->
                <iterate expression="$body//response" id="ITR_RES" sequential="true">
        </aggregate>
        <log level="custom">
            <property expression="$body" name="AT THE END"/>
        </log>
        <send/>
    </sequence>
    
    <!-- Inserted a short delay to prevent flooding the GLIS server -->
    <script language="js">java.lang.Thread.sleep(200);</script>
    
    <property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
    <property name="HTTP_METHOD" scope="axis2" type="STRING" value="post"/>
    <property name="ClientApiNonBlocking" value="true" scope="axis2" action="remove"/>
    <send>
        <endpoint key="glisEndpoint"/>
    </send
    
    
    
    因此,我基本上是使用WSO2 ESB提供的2企业集成模式来完成这项任务:拆分器和聚合器。在我看来,这应该是此类任务的标准解决方案(当您必须向外部web服务发送n条消息,然后从该web服务收集并操作n条响应时)。我的体系结构是这类任务的标准体系结构吗

    我这样问是因为现在我发现了以下问题:

    我已经在一个测试环境中部署了这个应用程序,我们遇到了以下问题

    测试环境在同一台笔记本电脑上安装了此WSO2 ESB应用程序和联系的web服务(但在生产环境中,这些系统将位于不同的计算机上,因为将有许多WSO2 ESB应用程序和一个从这些ESB应用程序接收消息的中央web服务)

    问题是WSO2应用程序生成了大量XML文档(大约1000个),因此它将连续执行1000个对web服务的POST请求。 web服务接收所有这些请求(包含必须插入到另一个数据库中的1000个XML文档),但经过一定数量的DB inserton之后,DB(Postgree)会给出一个过多客户端异常

    所以这个异常可能与以下内容有关:连接未关闭、结果集未关闭或类似的内容

    我个人的观点(可能是错误的)是,这应该是一个与web服务后端相关的问题,而不是与我的WSO2 ESB应用程序相关的问题。但是测试它的人对我说,可能WSO2应用程序没有关闭连接

    这对我来说似乎很奇怪,因为这是数据库上的错误,而不是web服务上的错误,但我真的不知道

    另一件事是,我解决了这个问题,在将POST请求发送到web服务之前延迟了几毫秒,方法如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <sequence name="glisOutSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
        <aggregate id="ITR_AGG">
            <completeCondition>
                <messageCount max="-1" min="-1"/>
            </completeCondition>
            <onComplete expression="s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1]" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s12="http://www.w3.org/2003/05/soap-envelope">
                <property name="it_count" scope="operation" type="STRING" value="0"/>
                <!-- Iterate over responses. For correct count calculations they should 
                    be sequential -->
                <iterate expression="$body//response" id="ITR_RES" sequential="true">
        </aggregate>
        <log level="custom">
            <property expression="$body" name="AT THE END"/>
        </log>
        <send/>
    </sequence>
    
    <!-- Inserted a short delay to prevent flooding the GLIS server -->
    <script language="js">java.lang.Thread.sleep(200);</script>
    
    <property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
    <property name="HTTP_METHOD" scope="axis2" type="STRING" value="post"/>
    <property name="ClientApiNonBlocking" value="true" scope="axis2" action="remove"/>
    <send>
        <endpoint key="glisEndpoint"/>
    </send
    
    
    java.lang.Thread.sleep(200);
    
    我个人的意见-我不明白WSO2端的“不关闭连接”是怎么回事(充当PHP服务的客户端) 可能是PHP和数据库之间的产品问题

    我看不出您在解决方案中使用的集成模式有任何问题-一切看起来都正常

    所以,我认为PHP web服务中的问题或者它在本地测试笔记本电脑上的特定配置

    例如,java应用程序总是使用连接池来获取DB连接- 此连接池的设置可以控制到DB的连接数。 不确定——但PHP可能也有一些连接池

    此外,数据库通常有许多关于同时可能的连接数的选项

    因此-可能所有配置都是由produc正确配置的