Noel
Noel

Reputation: 59

wso2 ESB: Clone and Aggregate timed out

I tried using both a proxy and an API in WSO2 ESB to test the aggregation of similar SOAP web services into one response but I'm just having time-outs. For testing I'm using a Weather web service (http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl). I'm basically calling the same action GetCityWeatherByZIP twice by using the clone mediator providing a different ZIP code for each, and then aggregating the results. Eventualy the intention is to call web services which are hosted on different servers but for the moment I was trying to use the same service. I would appreciate any help I can get.

Below is the proxy config:

 <?xml version="1.0" encoding="UTF-8"?>
   <proxy xmlns="http://ws.apache.org/ns/synapse"
       name="aggre"
       transports="http"
       statistics="disable"
       trace="enable"
       startOnLoad="true">
      <target>
      <inSequence>
         <clone>
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <m0:GetCityWeatherByZIP xmlns:m0="http://ws.cdyne.com/WeatherWS/">
                           <m0:ZIP>11001</m0:ZIP>
                        </m0:GetCityWeatherByZIP>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="Action" scope="default" value="urn:GetCityWeatherByZIP "/>
                  <call>
                     <endpoint key="weather"/>
                  </call>
               </sequence>
            </target>
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <m0:GetCityWeatherByZIP xmlns:m0="http://ws.cdyne.com/WeatherWS/">
                           <m0:ZIP>11010</m0:ZIP>
                        </m0:GetCityWeatherByZIP>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="Action" scope="default" value="urn:GetCityWeatherByZIP "/>
                  <call>
                     <endpoint key="weather"/>
                  </call>
               </sequence>
            </target>
         </clone>
         <aggregate>
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete xmlns:m0="http://ws.cdyne.com/WeatherWS"
                        expression="/m0:GetCityWeatherByZIPResponse">
               <drop/>
            </onComplete>
         </aggregate>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
      </target>
      <description/>
   </proxy>

Below is the weather endpoint config:

 <endpoint xmlns="http://ws.apache.org/ns/synapse" name="weather">
   <address uri="http://wsf.cdyne.com/WeatherWS/Weather.asmx" format="soap11">
      <suspendOnFailure>
         <progressionFactor>1.0</progressionFactor>
      </suspendOnFailure>
      <markForSuspension>
         <retriesBeforeSuspension>0</retriesBeforeSuspension>
         <retryDelay>0</retryDelay>
      </markForSuspension>
   </address>
</endpoint>

Carbon Log:

TID: [0] [ESB] [2014-07-08 11:10:44,377]  INFO {org.apache.axis2.transport.http.HTTPSender} -  Unable to sendViaPost to url[http://servername:8281/services/aggre.aggreHttpSoap11Endpoint] {org.apache.axis2.transport.http.HTTPSender}
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
    at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413)
    at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
    at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:622)
    at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
    at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:451)
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:278)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:430)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
    at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:554)
    at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:530)
    at org.apache.jsp.admin.jsp.WSRequestXSSproxy_005fajaxprocessor_jsp._jspService(org.apache.jsp.admin.jsp.WSRequestXSSproxy_005fajaxprocessor_jsp:276)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.wso2.carbon.ui.JspServlet.service(JspServlet.java:155)
    at org.wso2.carbon.ui.TilesJspServlet.service(TilesJspServlet.java:80)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.equinox.http.helper.ContextPathServletAdaptor.service(ContextPathServletAdaptor.java:37)
    at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128)
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:68)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service(DelegationServlet.java:68)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter.doFilter(CharacterSetFilter.java:61)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178)
    at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:49)
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141)
    at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:156)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:52)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1653)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
TID: [0] [ESB] [2014-07-08 11:10:44,420]  WARN {org.apache.synapse.transport.passthru.SourceHandler} -  Connection time out after request is read: http-incoming-295 {org.apache.synapse.transport.passthru.SourceHandler}   

Upvotes: 0

Views: 1450

Answers (2)

Jean-Michel
Jean-Michel

Reputation: 5946

SOAP Action is incorrect, must be http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP

Namespace for the aggregate's onComplete xpath expression is incorrect, a '/' is missing at the end : http://ws.cdyne.com/WeatherWS/

After aggregation, you don't want to drop the message, you want to send it as a response : replace <drop/> with <send/> in the "onComplete" mediation

The response will be a soap message and SOAP Body must have one root node as first child so you have to apply a transformation, for exemple :

<payloadFactory media-type="xml">
  <format>
    <response>
      $1
     </response>
  </format>
  <args>
    <arg evaluator="xml" xmlns:m0="http://ws.cdyne.com/WeatherWS/" expression="//m0:GetCityWeatherByZIPResponse"/>
  </args>
</payloadFactory>

By default, clone mediator stop parent mediation, you need to specify continueParent="true" if you want the aggregate to be executed

With call mediator, underline worker thread returns without waiting for the response : the request used to execute your proxy will reach your aggregate : before executing aggregate mediator, test if the message is a GetCityWeatherByZIPResponse

Complete proxy :

<?xml version="1.0" encoding="UTF-8"?>
   <proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TestSOF"
       transports="http"
       statistics="disable"
       trace="enable"
       startOnLoad="true">
      <target>
      <inSequence>
         <clone continueParent="true">
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <m0:GetCityWeatherByZIP xmlns:m0="http://ws.cdyne.com/WeatherWS/">
                           <m0:ZIP>11001</m0:ZIP>
                        </m0:GetCityWeatherByZIP>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="Action" scope="default" value="http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP"/>
                  <call>
                     <endpoint key="weather"/>
                  </call>
               </sequence>
            </target>
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <m0:GetCityWeatherByZIP xmlns:m0="http://ws.cdyne.com/WeatherWS/">
                           <m0:ZIP>11010</m0:ZIP>
                        </m0:GetCityWeatherByZIP>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="Action" scope="default" value="http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP"/>
                  <call>
                     <endpoint key="weather"/>
                  </call>
               </sequence>
            </target>
         </clone>
         <filter source="local-name($body/*[1])" regex="GetCityWeatherByZIPResponse">
            <then>
                 <aggregate>
                    <completeCondition>
                       <messageCount min="-1" max="-1"/>
                    </completeCondition>
                    <onComplete xmlns:m0="http://ws.cdyne.com/WeatherWS/"
                                expression="//m0:GetCityWeatherByZIPResponse">
                        <payloadFactory media-type="xml">
                            <format>
                               <response>
                                $1
                               </response>
                            </format>
                            <args>
                               <arg evaluator="xml" xmlns:m0="http://ws.cdyne.com/WeatherWS/" expression="//m0:GetCityWeatherByZIPResponse"/>
                            </args>
                         </payloadFactory>
                         <send/>
                    </onComplete>
                 </aggregate>
            </then>
        </filter>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
      </target>
      <description/>
   </proxy>

Endpoint :

<?xml version="1.0" encoding="UTF-8"?>
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="weather">
   <wsdl service="Weather"
         port="WeatherSoap"
         uri="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"/>
</endpoint>

The response I get :

<response xmlns="http://ws.apache.org/ns/synapse">
<GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
<GetCityWeatherByZIPResult>
<Success>true</Success>
<ResponseText>City Found</ResponseText>
<State>NY</State>
<City>Franklin Square</City>
<WeatherStationCity>Farmingdale</WeatherStationCity>
<WeatherID>14</WeatherID>
<Description>Cloudy</Description>
<Temperature>73</Temperature>
<RelativeHumidity>78</RelativeHumidity>
<Wind>S6</Wind>
<Pressure>29.75R</Pressure>
<Visibility/>
<WindChill/>
<Remarks/>
</GetCityWeatherByZIPResult>
</GetCityWeatherByZIPResponse>
<GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
<GetCityWeatherByZIPResult>
<Success>true</Success>
<ResponseText>City Found</ResponseText>
<State>NY</State>
<City>Floral Park</City>
<WeatherStationCity>Farmingdale</WeatherStationCity>
<WeatherID>14</WeatherID>
<Description>Cloudy</Description>
<Temperature>73</Temperature>
<RelativeHumidity>78</RelativeHumidity>
<Wind>S6</Wind>
<Pressure>29.75R</Pressure>
<Visibility/>
<WindChill/>
<Remarks/>
</GetCityWeatherByZIPResult>
</GetCityWeatherByZIPResponse>
</response>

Upvotes: 1

Jean-Michel
Jean-Michel

Reputation: 5946

call mediator rely on non-blocking transport : edit repository/conf/nhttp.properties and add http.socket.timeout.sender=60000 if you agree to wait for 60 seconds

Upvotes: 0

Related Questions