Перебор ответа DSS(3.2.2) в WSO2 ESB(4.8.1) не работает должным образом

Я делаю итерацию по ответу DSS, но не работаю должным образом

Ниже представлена ​​полезная нагрузка и вызов DSS:

<payloadFactory media-type="xml">
      <format>
         <p:getNominaIDDetails xmlns:p="http://ws.wso2.org/dataservice">
            <xs:column1 xmlns:xs="http://ws.wso2.org/dataservice">$1</xs:column1>
            <xs:column2 xmlns:xs="http://ws.wso2.org/dataservice">$2</xs:column2>
            <xs:column3 xmlns:xs="http://ws.wso2.org/dataservice">$3</xs:column3>
            <xs:column4 xmlns:xs="http://ws.wso2.org/dataservice">$4</xs:column4>
         </p:getNominaIDDetails>
      </format>
      <args>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('column1')" evaluator="xml"></arg>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('column2')" evaluator="xml"></arg>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('column3')" evaluator="xml"></arg>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('column4')" evaluator="xml"></arg>
      </args>
   </payloadFactory>

   <header name="Action" scope="default" value="urn:xxxxxxx"></header>
   <call>
      <endpoint key="gov:/dss/endpoint"></endpoint>
   </call>
    <filter xmlns:ns="http://org.apache.synapse/xsd"
           xmlns:ds="http://ws.wso2.org/dataservice"
           xpath="get-property('db_count')&gt;0">
      <then>
         <iterate id="xxx"
                  preservePayload="true"
                  attachPath="//ds:xxxx"
                  expression="//ds:xxx/ds:xxx">
            <target sequence="My_seq">
            </target>
         </iterate>
      </then>
      <else>
         <drop/>
      </else>
   </filter>

Ответ от dss:

<response xmlns="http://ws.wso2.org/dataservice">       
        <id>
            <column1>234</column1>
            <column1>4455</column1>
            <column1>567778</column1>
        </id>
        <id>
            <column1>546</column1>
            <column1>56866</column1>
            <column1>464453</column1>
        </id>
        <id>
            <column1>546</column1>
            <column1>56866</column1>
            <column1>464453</column1>
        </id>
    </response>

Приведенный выше ответ завершается с первой итерацией, а оставшиеся все сообщения истекают после глобального тайм-аута. Ниже приведены журналы после первой итерации:

{org.apache.synapse.mediators.builtin.LogMediator}
TID: [0] [ESB] [2016-09-04 06:26:13,471]  WARN {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Synapse received a response for the request with message Id : urn:uuid:c62d7dae-5290-49d1-b1bd-b5d2dcba7e04 But a callback is not registered (anymore) to process this response {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [0] [ESB] [2016-09-04 06:26:42,144]  WARN {org.apache.synapse.core.axis2.TimeoutHandler} -  Expiring message ID : urn:uuid:36df3897-73be-4bc3-a434-aaab618c7ce3; dropping message after global timeout of : 180 seconds {org.apache.synapse.core.axis2.TimeoutHandler}
TID: [0] [ESB] [2016-09-04 06:26:42,145]  WARN {org.apache.synapse.core.axis2.TimeoutHandler} -  Expiring message ID : urn:uuid:d8ec8998-95c6-4d70-9e33-c11bda271e90; dropping message after global timeout of : 180 seconds {org.apache.synapse.core.axis2.TimeoutHandler}

Примечание: внутри итератора выполняются следующие операции (sequence="My_seq")

выполнение вызова банка --> вызов DSS --> вызов SAP с использованием медиатора вызовов

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="My_seq" >
    <property xmlns:ns="http://org.apache.synapse/xsd" xmlns:ds="http://ws.wso2.org/dataservice" name="id" expression="//ds:dss_response/ds:Id" scope="default" type="STRING"/>
    <payloadFactory media-type="xml">
        <format>
            <h:opertion xmlns:h="http://ws.wso2.org/xxxxxx">
                <h2h:id>$1</h2h:id>
            </h:opertion>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml" expression="get-property('id')"/>
        </args>
    </payloadFactory>
    <property xmlns:ns="http://org.apache.synapse/xsd" name="Authorization" expression="fn:concat('Basic ', base64Encode('xxxxx:xxxxxxxx'))" scope="transport" type="STRING"/>
    <property name="ContentType" value="application/soap+xml" scope="axis2" type="STRING"/>
    <property name="messageType" value="application/soap+xml" scope="axis2" type="STRING"/>
     <call>
        <endpoint key="gov:/endpoint"/>
     </call>
    <sequence key="next_sequence_to_be_DSS_then_SAP"/>
</sequence>

person Siddu    schedule 04.09.2016    source источник
comment
Ваш конфиг выглядит нормально. Можете ли вы включить проводные журналы и обновить свой вопрос с помощью журналов? mytecheye.blogspot.com/2013/09/   -  person Bee    schedule 04.09.2016
comment
опубликуйте свою конфигурацию My_seq тоже   -  person Bee    schedule 04.09.2016
comment
@Bhathiya, поскольку мои проводные журналы слишком велики, я думаю, что не могу поделиться ими, есть ли другой способ поделиться всеми журналами и кодом?   -  person Siddu    schedule 04.09.2016
comment
Как я вижу в проводных журналах, проблема с посредником вызова, используемым для вызова банка. В основном он должен сработать и забыть, но этого не происходит, и ожидание ответа после этого переходит в состояние SUSPENDED.   -  person Siddu    schedule 04.09.2016


Ответы (1)


Я считаю, что это должно соответствовать вашим требованиям. Здесь я проверяю статус входящих ответов и отправляю клиенту OK, только если каждый запрос был успешным.

<api xmlns="http://ws.apache.org/ns/synapse" name="MyAPI" context="/myapi">
   <resource methods="POST GET" url-mapping="/">
      <inSequence>
         <call blocking="true">
            <endpoint>
               <http uri-template="http://www.mocky.io/v2/57cd6f422d00000101b15868"/>
            </endpoint>
         </call>
         <property name="Staus" value="OK" type="STRING"/>
         <iterate xmlns:ds="http://ws.wso2.org/dataservice" id="xxx" preservePayload="true" expression="//ds:response/ds:id">
            <target>
               <sequence>
                  <send>
                     <endpoint>
                        <http uri-template="http://www.mocky.io/v2/57cd70c22d00002401b1586c"/>
                     </endpoint>
                  </send>
               </sequence>
            </target>
         </iterate>
      </inSequence>
      <outSequence>
         <filter source="$axis2:HTTP_SC" regex="200">
            <then/>
            <else>
               <property name="Staus" value="NOT OK" type="STRING"/>
            </else>
         </filter>
         <aggregate id="xxx">
            <completeCondition>
               <messageCount/>
            </completeCondition>
            <onComplete xmlns:ds="http://ws.wso2.org/dataservice" expression="/">
               <log level="custom">
                  <property name="Final Staus" expression="$ctx:Staus"/>
               </log>
               <payloadFactory media-type="xml">
                  <format>
                     <status>$1</status>
                  </format>
                  <args>
                     <arg evaluator="xml" expression="$ctx:Status"/>
                  </args>
               </payloadFactory>
               <send/>
            </onComplete>
         </aggregate>
      </outSequence>
   </resource>
</api>
person Bee    schedule 04.09.2016
comment
Я исключаю ответ, получаю ответ от банка и преобразовываю отправку обратно в SAP... это одна итерация, как это должно происходить для многих итераций. Но мой случай останавливается с первой итерацией - person Siddu; 04.09.2016
comment
В первой итерации я получаю ответ при попытке тайм-аута второй итерации или перехода в состояние SUSPENDED. - person Siddu; 04.09.2016
comment
какого ответа вы ожидаете? Это совокупный ответ? - person Bee; 04.09.2016
comment
Ваше требование не ясно. Ранее вы сказали It should fire and forgot. И здесь вы говорите, что ожидаете ответа. - person Bee; 04.09.2016
comment
Я получаю зашифрованный формат ответа от банка, в ответе нет агрегации. - person Siddu; 05.09.2016
comment
я имел в виду, что должен сделать блокирующий вызов банковской службы, чтобы он продолжался с другими итерациями... Здесь я пробовал с посредником вызова/отправки, но он не делает блокирующий вызов. - person Siddu; 05.09.2016
comment
мм.. до сих пор я в замешательстве. позвольте мне сказать вам, что я понял. поправьте меня если я ошибаюсь. Вы звоните в DSS. он дает ответ выше. вам нужно разделить его и отправить каждый из них в банковскую службу, и каждый из этих ответов отправляется в другую службу dss. И ответы от них нужно отправлять в SAP. в конце вам нужен ответ. Это правильно. Какая информация вам нужна в этом ответе? - person Bee; 05.09.2016
comment
Вы звоните в DSS. он дает ответ выше. вам нужно разделить его и отправить каждый из них в банковскую службу, и каждый из этих ответов отправляется в другую службу dss. И ответы от них нужно отправлять в SAP. в конце мне нужно обновить базу данных, только если вызов SAP успешен. - person Siddu; 05.09.2016
comment
Если какая-либо ошибка возникает в первой итерации при отправке в SAP, она не должна обновлять базу данных, но должна продолжаться с другими итерациями. - person Siddu; 05.09.2016
comment
Надеюсь вы поняли мою проблему, жду решения - person Siddu; 05.09.2016
comment
Что возвращает SAP в успешных и неуспешных запросах? только коды состояния? - person Bee; 05.09.2016
comment
Вы звоните в DSS. он дает ответ выше. вам нужно разделить его и отправить каждый из них в банковскую службу... Здесь это само по себе не происходит. То, что здесь происходит, выполняется с первой итерацией, а остальные все итерации отбрасываются после глобального тайм-аута (используется посредник вызова для вызова банковской службы) - person Siddu; 05.09.2016
comment
Можешь поделиться последовательностью? - person Bee; 05.09.2016
comment
seq добавлен в мой пост, пожалуйста, посмотрите и дайте мне знать - person Siddu; 05.09.2016