迭代介体几乎总是发送重复的有效负载

时间:2014-04-22 20:59:57

标签: wso2 wso2esb

我们正在尝试一种方案,我们希望迭代节点列表,并使用每个单独的请求有效负载对某个服务进行POST调用。我们看到迭代中介实际上在该调用中发送了两个元素 这会导致API端出现问题。

我在本地部署了一个模拟服务,返回响应说:

<result>
   <row>
      <product_id>8351</product_id>
      <event_key>17708</event_key>
      <event_code>AEONBM</event_code>
      <show_title>Some Show</show_title>
      <venue_name>Eugene ONeill Theatre</venue_name>
      <area>ORCHC</area>
      <row>C</row>
      <seat_num>103</seat_num>
      <seat_increment>1</seat_increment>
      <marketing_code>PREMIUM</marketing_code>
      <Cost>352.0000</Cost>
   </row>
   <row>
      <product_id>8351</product_id>
      <event_key>17708</event_key>
      <event_code>AEONBM</event_code>
      <show_title>Some Show</show_title>
      <venue_name>Eugene ONeill Theatre</venue_name>
      <area>ORCHC</area>
      <row>C</row>
      <seat_num>104</seat_num>
      <seat_increment>1</seat_increment>
      <marketing_code>PREMIUM</marketing_code>
      <Cost>352.0000</Cost>
   </row
</result>

以下是我的代理服务的样子:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="CreateListingFromGetLocation"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full">
            <property name="text" value="Triggering getLocation API call.."/>
         </log>
         <send receive="createListingsFromGetLocationResponseSequence">
            <endpoint>
               <http method="get" uri-template="http://localhost:8989/GetLocation/"/>
            </endpoint>
         </send>
         <property name="OUT_ONLY" value="true"/>
      </inSequence>
      <outSequence>
        <send/>
      </outSequence>
      <faultSequence/>
   </target>
   <description/>
</proxy>

这是我使用迭代介体的接收序列:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="createListingsFromGetLocationResponseSequence">
   <iterate xmlns:tem="http://tempuri.org" xmlns:ns="http://org.apache.synapse/xsd" expression="//result/row">
      <target>
         <sequence>
            <log level="full">
               <property name="LocationRow" value="Row element from GetLocationResponse"></property>
            </log>
            <payloadFactory media-type="xml">
               <format>
                  <listing xmlns="">
                     <eventId>$1</eventId>
                     <eventDescription>$2</eventDescription>
                     <pricePerTicket>
                        <amount>$3</amount>
                        <currency>USD</currency>
                     </pricePerTicket>
                     <quantity>$4</quantity>
                     <section>$5</section>
                     <rows>$6</rows>
                     <seats>$7</seats>
                     <splitOption>NONE</splitOption>
                  </listing>
               </format>
               <args>
                  <arg expression="//event_key" evaluator="xml"></arg>
                  <arg expression="//show_title" evaluator="xml"></arg>
                  <arg expression="//Cost" evaluator="xml"></arg>
                  <arg expression="//seat_increment" evaluator="xml"></arg>
                  <arg expression="//area" evaluator="xml"></arg>
                  <arg expression="//row/row" evaluator="xml"></arg>
                  <arg expression="//seat_num" evaluator="xml"></arg>
               </args>
            </payloadFactory>
            <log level="full">
               <property name="ListingRequest" value="Listing request xml"></property>
            </log>
            <property name="Content-Type" value="application/xml" scope="transport" type="STRING"></property>
            <property name="messageType" value="application/xml" scope="transport" type="STRING"></property>
            <property name="TARGET_HOST" value="srwd30" scope="transport" type="STRING"></property>
            <property name="HTTP_METHOD" value="POST" scope="transport" type="STRING"></property>
            <send>
               <endpoint>
                  <http format="pox" method="post" uri-template="http://www.srwd30.com/listings/v1/"></http>
               </endpoint>
            </send>
         </sequence>
      </target>
   </iterate>
</sequence>

首先,我看到它正在迭代每个xml节点,这里有一些日志表明:

[2014-04-22 13:29:42,020]  INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:3bc14a33-3a7a-478e-bdbf-720f1ec855a5, Direction: response, LocationRow = Row element from GetLocationResponse, Envelope: <?xml version="1.0" encoding="utf-8
"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><row>
      <product_id>8351</product_id>
      <event_key>17708</event_key>
      <event_code>AEONBM</event_code>
      <show_title>Some Show</show_title>
      <venue_name>Eugene ONeill Theatre</venue_name>
      <area>ORCHC</area>
      <row>D</row>
      <seat_num>103</seat_num>
      <seat_increment>1</seat_increment>
      <marketing_code>PREMIUM</marketing_code>
      <Cost>352.0000</Cost>
   </row></soapenv:Body></soapenv:Envelope>
[2014-04-22 13:29:42,021]  INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:0e04ac15-a0bf-41a3-a7d7-80a1401d3efc, Direction: response, ListingRequest = Listing request xml, Envelope: <?xml version="1.0" encoding="utf-8"?><soapenv:En
velope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><listing><eventId>17708</eventId><eventDescription>Some Show</eventDescription><pricePerTicket><amount>352.0000</amount><currency>USD</currency></pricePerTicket><quantity>1</quantity><section>ORCHC</section><rows
>C</rows><seats>103</seats><splitOption>NONE</splitOption></listing></soapenv:Body></soapenv:Envelope>

但在我的API上,我发现我们正在接收重复或两个根节点:

Content-Type: application/xml
Headers: {cache-control=[no-cache], connection=[Keep-Alive],
content-type=[application/xml], host=[www.srwd30.com], http_method=[POST], messagetype=[application/xml], target_host=[srwd30], transfer-encoding=
[chunked], user-agent=[Synapse-PT-HttpComponents-NIO]}
Payload: <listing><eventId>17708</eventId><eventDescription>Some Show</eventDescription><pricePerTicket><amount>352.0000</amount><currency>USD</currenc
y></pricePerTicket><quantity>1</quantity><section>ORCHC</section><rows>C</rows><seats>103</seats><splitOption>NONE</splitOption></listing><listing><eventId>1770
8</eventId><eventDescription>Some Show</eventDescription><pricePerTicket><amount>352.0000</amount><currency>USD</currency></pricePerTicket><quantity>1<
/quantity><section>ORCHC</section><rows>D</rows><seats>104</seats><splitOption>NONE</splitOption></listing>
--------------------------------------
2014-04-22 19:01:51,468 [e14f#fbf/http://www.srwd30.com/listings/v1/] priority=WARN  app_name=shared-stubhubjobs thread=http-0.0.0.0-
8080-8 location=AbstractJAXBProvider line=112 javax.xml.bind.UnmarshalException
 - with linked exception:
[com.ctc.wstx.exc.WstxParsingException: Illegal to have multiple roots (start tag in epilog?).
 at [row,col {unknown-source}]: [1,291]]

从它的外观来看,迭代器在发出调用时发送了两个元素。我错过了什么或做错了什么?如何使每个呼叫独立于其他呼叫?

2 个答案:

答案 0 :(得分:1)

我通过使用urn:为该标头的测试值添加Action标头来解决问题。我意识到这导致发送重复的请求,有时只发送一个请求,即使迭代器有大约10条记录。

    <proxy name="PushInventory"
      transports="https http"
      startOnLoad="true"
      trace="disable">
  <description/>
  <target>
     <inSequence>
        <log level="full">
           <property name="STATUS"
                     value="+++++++++++++++++ Inside PushInventory Proxy Service ++++++++++++++++++"/>
        </log>
        <iterate xmlns:tem="http://tempuri.org"
                 xmlns:ns="http://org.apache.synapse/xsd"
                 id="pushInventoryIterator"
                 expression="//result/row"
                 sequential="true">
           <target>
              <sequence>
                 <payloadFactory media-type="xml">
                    <format>
                       <listing xmlns="">
                          <eventId>$1</eventId>
                          <eventDescription>$2</eventDescription>
                          <pricePerTicket>
                             <amount>$3</amount>
                             <currency>USD</currency>
                          </pricePerTicket>
                          <quantity>$4</quantity>
                          <section>$5</section>
                          <rows>$6</rows>
                          <seats>$7</seats>
                          <splitOption>NONE</splitOption>
                       </listing>
                    </format>
                    <args>
                       <arg evaluator="xml" expression="//event_key"/>
                       <arg evaluator="xml" expression="//show_title"/>
                       <arg evaluator="xml" expression="//Cost"/>
                       <arg evaluator="xml" expression="//seat_increment"/>
                       <arg evaluator="xml" expression="//area"/>
                       <arg evaluator="xml" expression="//row_desc"/>
                       <arg evaluator="xml" expression="//seat_num"/>
                    </args>
                 </payloadFactory>
                 <log level="full">
                    <property name="STATUS"
                              value="++++++++++++ Invoking Listing EndPoint ++++++++++++++"/>
                 </log>
                 <property name="Authorization"
                           value="Basic dafdsfadsfdsafdsfdsafdsafsdfadsf"
                           scope="transport"
                           type="STRING"/>
                 <property name="Content-Type"
                           value="application/xml"
                           scope="transport"
                           type="STRING"/>
                 <property name="messageType"
                           value="application/xml"
                           scope="axis2"
                           type="STRING"/>
                 <property name="HTTP_METHOD" value="POST" scope="transport" type="STRING"/>
                 <header name="Action" scope="default" value="urn:test"/>
                 <send>
                    <endpoint key="ListingEndPoint"/>
                 </send>
              </sequence>
           </target>
        </iterate>
     </inSequence>
     <outSequence>
        <log level="full">
           <property name="STATUS"
                     value="+++++++++++++++++ Inside OutSequence of PushInventory ++++++++++++++++++"/>
        </log>
        <aggregate>
           <completeCondition>
              <messageCount min="10" max="10"/>
           </completeCondition>
           <onComplete xmlns:ns2="com.blah.blah" expression="//listing">
              <log level="full" separator=",">
                 <property name="STATUS"
                           value="+++++++++++++++++ Aggregating responses back ++++++++++++++++++"/>
              </log>
              <enrich>
                 <source type="envelope" clone="true"/>
                 <target type="body"/>
              </enrich>
              <send/>
           </onComplete>
        </aggregate>
     </outSequence>
  </target>
    </proxy>

答案 1 :(得分:0)

您将日志放在迭代器介体之前,并查看您从端点接收的内容。它可能包含重复的条目。然后在迭代中你有另一个日志中介。检查记录是否正确。