WSO2迭代调用端点直到正确响应

时间:2016-01-29 22:49:39

标签: wso2 esb

我正在使用wso2 ESB 4.8.1

我的完整功能是:

  1. 第一步: 我打电话给一个用processId(Asynchcronous)回复我的服务

    该服务使工作与该processId

  2. 相关联
  3. 第二步: 我必须迭代使用processId调用服务直到一个响应表明我已完成该过程并返回结果

  4. 我遇到第二步实施的问题。

2 个答案:

答案 0 :(得分:1)

您可以将带有进程ID的响应存储到消息存储库中。

定义消息处理器(预定消息转发处理器),它使用来自此存储的消息并将它们发送到代理服务(在同一ESB中定义)

在此代理服务中:

  • 您使用流程ID
  • 呼叫您的服务
  • 你在这个代理outSequence中分析它的响应并决定返回它,如果它没问题(所以,消息处理器将执行reply.sequence并从商店中删除消息)或返回如果没有错误(消息处理器将执行fault.sequence并将消息存储在商店中,它将在下次重试)

答案 1 :(得分:1)

非常感谢你,我会尝试你的解决方案。

我已经用一个secuence取得了一些进展,检查processId是否已经完成,如果没有secuence调用它自己(递归),我正在测试这个替代方案,我把代码(有些认为是硬代码,但是重要的是这个想法)

  <resource methods="GET" uri-template="/test2">
      <inSequence>
         <log>
            <property name="***** IN" value="Estoy en el GET /recursivetest1/test2"></property>
           </log>
         <call>
            <endpoint name="uploadServlet">
               <!-- this is the request that return the processId -->
               <http method="get" uri-template="http://localhost:1234/ProyectoWebMultipartForm/UploadServlet?fase=escaneo"></http>
            </endpoint>
         </call>
         <log>
            <property name="data_id" expression="json-eval($.data_id)"></property>
         </log>
         <property name="escaneo" expression="json-eval($.data_id)"></property>
         <sequence key="iterate_calls2"></sequence>
         <send></send>
      </inSequence>
      <outSequence>

      </outSequence>
   </resource>
</api>


/////////////////

<sequence xmlns="http://ws.apache.org/ns/synapse" name="iterate_calls2" trace="disable">

   <call>
      <!-- this is the request that check if the processId has finished-->
      <endpoint name="uploadServlet">
         <http method="get" uri-template="http://localhost:1234/ProyectoWebMultipartForm/UploadServlet?fase=chequeo"></http>
      </endpoint>
   </call>

   <property xmlns:ns="http://org.apache.synapse/xsd" name="resultado" expression="json-eval($.scan_results.scan_all_result_a)"></property>
   <filter xmlns:ns="http://org.apache.synapse/xsd" source="get-property('resultado')" regex="Clean">
      <then>
         <log level="full">
            <property name="MESSAGE" value="No hay virus"></property>
         </log>
      </then>
      <else>

         <property name="mensaje" expression="json-eval($.mensaje)"></property>
         <filter source="get-property('mensaje')" regex="Escaneo sin finalizar">
            <then>
               <!-- the processId has not finished, I call again to the sequence, recursion-->
               <log level="full">
                  <property name="MESSAGE" value="El escaneo no ha finalizado antes del sleep"></property>
               </log>
               <script language="js">
                  <![CDATA[java.lang.Thread.sleep(200);]]></script>
                  <log level="full">
                     <property name="MESSAGE" value="El escaneo no ha finalizado despues del sleep"></property>
                  </log>
                  <sequence key="iterate_calls2"></sequence>
               </then>
               <else>
                  <!-- the processId has finished, I have end-->
                  <log level="full">
                     <property name="MESSAGE" value="No hay virus"></property>
                  </log>
               </else>
            </filter>
         </else>
      </filter>
   </sequence>