【问题标题】:WSO2 ESB Iterate CounterWSO2 ESB 迭代计数器
【发布时间】:2013-07-09 14:25:09
【问题描述】:

我正在使用迭代调解器来保存文件。 为此,我需要一个迭代计数器。我尝试在迭代之外创建一个属性,并使用脚本调解器来计算迭代次数,如下所示。

  <property name="AttachmentCounter" value="0"/>
      <iterate xmlns:ns="http://org.apache.synapse/xsd" continueParent="true" expression="$body/ticket/IctAttachments/item" id="IctAttachments" sequential="true">
         <target>
            <sequence>
               <script language="js">
                 <![CDATA[var counter = mc.getProperty("AttachmentCounter");
                 counter = parseInt(counter) + 1; 
                 mc.setProperty("AttachmentCounter", counter);]]>
               </script>
               <log>
                 <property name="AttachmentCounter:" expression="get-property('AttachmentCounter')"/>
               </log>
           </sequence>
        </target>
     </iterate>

问题是,每次迭代后我都会得到相同的数字。这是什么原因?有没有我看不到的错误? 也许还有另一种我在搜索互联网时找不到的方法。

【问题讨论】:

    标签: javascript iteration wso2 esb


    【解决方案1】:

    Mediator iterate 内部复制 MessageContext,因此 target\sequence 内的所有更改都不会影响其余部分。

    您可以写mediator 进行计数:

    public class CountMediators extends AbstractMediator {
        private String xpathString = null;
        private String uri = null;
        private String prefix = null;
    
        @Override
        public boolean mediate(MessageContext synCtx) {
            SOAPEnvelope envelope = synCtx.getEnvelope();
            SynapseXPath expression = null;
            List splitElements = null;
            try {
                expression = new SynapseXPath(xpathString);
                if (uri != null && prefix != null)
                    expression.addNamespace(new NamespaceImpl(uri, prefix));
                splitElements = EIPUtils.getMatchingElements(envelope, synCtx, expression);
            } catch (JaxenException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            if (splitElements != null)
                synCtx.setProperty("count", splitElements.size());
            return true;
        }
    
        public String getXpathString() {
            return xpathString;
        }
    
        public void setXpathString(String xpathString) {
            this.xpathString = xpathString;
        }
    
        public String getUri() {
            return uri;
        }
    
        public void setUri(String uri) {
            this.uri = uri;
        }
    
        public String getPrefix() {
            return prefix;
        }
    
        public void setPrefix(String prefix) {
            this.prefix = prefix;
        }
    }
    

    这里可以下载jar,放置wso2esb-4.6.0/repository/components/lib/并重启esb

    使用manual

    【讨论】:

      【解决方案2】:

      通过使用messageSequence.iteratorID 属性,

      public class IteratorCounter extends AbstractMediator{
        @Override
        public boolean mediate(MessageContext ctx) {
      
            String msgSeq = (String) ctx.getProperty("messageSequence.it1"); 
      
            String count = msgSeq.split("/")[0];
      
            ctx.setProperty("msgNo", count);
      
            return true;
        }
      }
      

      messageSequence.it1 中的 it1 是迭代中介者的“迭代 ID”。每个拆分消息都会有一个属性调用“msgNo”作为从 0 开始的消息计数

      【讨论】:

        【解决方案3】:

        尝试这篇博文中建议的解决方案:http://bsenduran.blogspot.ru/2015/07/how-to-get-wso2-esb-iterate-mediators.html:

        <?xml version="1.0" encoding="UTF-8"?>
        <proxy xmlns="http://ws.apache.org/ns/synapse"
               name="count_iterate"
               transports="https,http"
               statistics="disable"
               trace="disable"
               startOnLoad="true">
           <target>
              <inSequence>
                 <property name="it_count" value="0" scope="operation"/>
                 <iterate expression="//symbols/symbol" sequential="true">
                    <target>
                       <sequence>
                          <property name="synapse_it_count" expression="get-property('operation', 'it_count')"/>
                          <script language="js">var cnt_str = mc.getProperty('synapse_it_count');
             var cnt = parseInt(cnt_str);
             cnt++;
             mc.setProperty('synapse_it_count', cnt.toString());</script>
                          <property name="it_count" expression="get-property('synapse_it_count')" scope="operation"/>
                          <aggregate>
                             <completeCondition>
                                <messageCount min="-1" max="-1"/>
                             </completeCondition>
                             <onComplete expression="//symbol">
                                <log level="custom">
                                   <property name="number of symbols" expression="get-property('operation','it_count')"/>
                                </log>
                                <respond/>
                             </onComplete>
                          </aggregate>
                       </sequence>
                    </target>
                 </iterate>
              </inSequence>
           </target>
           <description/>
        </proxy>                  
        

        【讨论】:

          【解决方案4】:

          为什么不在迭代发生之前进行计数?

          <property name="counter" scope="default" type="STRING" expression="fn:count($body/ticket/IctAttachments/item)"/>
          
          <log>
            <property expression="$ctx:counter" name="counter"/>
          </log>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多