WSo2 Esb过滤消息到输出文件第2部分

时间:2015-09-27 13:54:21

标签: loops wso2 esb mediator aggregator

好的,这是我原来问题的延续。 (WSo2 Esb filtering messages to an output file) 在对迭代和聚合调解器进行了几天的研究后,我已经达到了进度墙,并且非常感谢任何有关如何解决阻塞问题的建议。手头的任务是简单的,读取和xml文件,过滤某些记录,并且只产生一个输出xml文件,只包含那些符合条件的记录。在前面的讨论和研究之后,这个任务解决方案如下:使用迭代中介来访问每个xml记录并使用过滤介体来决定我想要保留的内容。然后使用聚合器介体将所有这些记录写入1个文件。如果没有聚合器,我的配置会为每个文件生成1条记录。 这是我在这个州的代理人:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="RenFileFilterProxy"
       transports="vfs"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full"/>
         <clone>
            <target sequence="RenIqtFilterSequence"/>
         </clone>
      </inSequence>
      <outSequence>
         <log level="custom">
            <property name="sequence" value="In the outSequence"/>
         </log>
         <log level="full"/>
         <aggregate id="QuizType">
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete xmlns:z="RowsetSchema" expression="//z:row">
               <call-template target="FileWriteTemplate">
                  <with-param name="targetFileName" value="TEST_FILE"/>
                  <with-param name="addressUri" value="vfs:file:///var/process/ren/rrout"/>
               </call-template>
            </onComplete>
         </aggregate>
      </outSequence>
   </target>
   <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
   <parameter name="transport.PollInterval">15</parameter>
   <parameter name="transport.vfs.MoveAfterProcess">file:///var/process/ren/extractedfiles</parameter>
   <parameter name="transport.vfs.FileURI">file:///var/process/ren/extractedfiles</parameter>
   <parameter name="transport.vfs.MoveAfterFailure">file:///var/process/ren/failure</parameter>
   <parameter name="transport.vfs.FileNamePattern">test.xml</parameter>
   <parameter name="transport.vfs.ContentType">application/xml</parameter>
   <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
   <description/>
</proxy> 

这是RenIqtFilterSequence:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="RenIqtFilterSequence">
   <log level="custom">
      <property name="sequence" value="RenIqtFilterSequence"></property>
   </log>
   <iterate xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" xmlns:z="RowsetSchema" expression="//z:row" id="QuizType">
      <target>
         <sequence>
            <log>
               <property name="iteratesequence" value="Iterating through the the records"></property>
            </log>
            <filter xmlns:rs="urn:schemas-microsoft-com:rowset" xpath="//z:row/@name='RP'">
               <then>
                  <log level="custom">
                     <property name="sequence" value="Condition Write"></property>
                  </log>
                  <log level="full"></log>
                  <log level="custom">
                     <property name="sequence" value="Getting ready to aggregate"></property>
                  </log>
               </then>
               <else>
                  <log level="custom">
                     <property name="sequence" value="Condition Drop"></property>
                  </log>
                  <drop></drop>
               </else>
            </filter>
         </sequence>
      </target>
   </iterate>
</sequence>

我现在面临的问题是我无法进入outSequence来执行我的聚合器逻辑。事实是我不需要从inSequence为这个过程调用后端服务,所以我很难找到一个干净的方法来到我的outSequence。任何Recomendations?我试图在我的inSequence中包含聚合器中介,但它不起作用,没有产生输出。我认为聚合器需要在outSequence中捕获我过滤的所有记录,然后我可以将它们全部写入1个文件。 我相信我需要一些配置:

            <filter xmlns:rs="urn:schemas-microsoft-com:rowset" xpath="//z:row/@name='RP'">
               <then>
                  <log level="custom">
                     <property name="sequence" value="Condition Write"></property>
                  </log>
                  <log level="full"></log>
                  <log level="custom">
                     <property name="sequence" value="Getting ready to aggregate"></property>
                  </log>
===============> Need to transfer to OutSequence somehow here!!!!<============
               </then>
               <else>

我已经尝试了几种基于文章和博客在线的方法,但我不能把最后的部分放到位。任何建议将不胜感激。感谢您抽出宝贵时间阅读本文。

0 个答案:

没有答案