You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WSO2中通过Script Mediator动态比较SOAP时间戳获取最新值

使用Script Mediator从SOAP消息中筛选最新时间戳的实现方案

需求:从SOAP消息的动态<Customer>节点中提取UpdateDate时间戳(格式示例:2018-04-26T05:59:38.226-07:00),通过Script Mediator比较所有时间戳,最终保留最新时间戳对应的CustomerID和时间值。

原代码存在的问题

  1. 局部变量无法跨迭代保留状态:脚本内的Latest_Updated_Date和Latest_Customer_Id是局部变量,每次<iterate>迭代都会重置,无法累积比较所有节点的时间
  2. 类型不匹配的错误比较:Latest_Updated_Date初始化为空字符串,直接与Time.getTime()(数值类型的时间戳)比较会导致逻辑错误
  3. 属性提取配置错误:<property>的expression未使用XPath语法提取节点文本值,且存在无效的</propertyGroup>标签

修正后的完整配置

<iterate expression="/Customer" id="customerIterate" sequential="true">
    <target>
        <sequence>
            <!-- 提取当前Customer节点的CustomerID和UpdateDate文本值 -->
            <property expression="//CustomerID/text()" name="CUS_ID_TO_UPDATE" scope="default" type="STRING"/>
            <property expression="//UpdateDate/text()" name="LATEST_DATE" scope="default" type="STRING"/>
            
            <script language="js"><![CDATA[
                var log = mc.getServiceLog();
                var SimpleDateFormat = Packages.java.text.SimpleDateFormat;
                var Date = Packages.java.util.Date;
                
                // 获取当前节点的ID和时间戳字符串
                var currentCusId = mc.getProperty('CUS_ID_TO_UPDATE');
                var currentDateStr = mc.getProperty('LATEST_DATE');
                
                // 初始化日期格式化器,匹配输入的时间戳格式
                var format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
                format.setTimeZone(Packages.java.util.TimeZone.getTimeZone("UTC")); // 统一时区避免偏差
                
                // 将字符串解析为Date对象,获取时间戳数值
                var currentDate = format.parse(currentDateStr);
                var currentTimestamp = currentDate.getTime();
                
                // 从synapse作用域获取全局的最新时间戳和ID(跨迭代保留)
                var latestTimestamp = mc.getProperty('GLOBAL_LATEST_TIMESTAMP');
                var latestCusId = mc.getProperty('GLOBAL_LATEST_CUS_ID');
                
                // 初始化全局变量(第一次迭代时)
                if (latestTimestamp == null || latestTimestamp === "") {
                    latestTimestamp = 0;
                    latestCusId = "";
                }
                
                // 比较时间戳,更新全局最新值
                if (currentTimestamp > latestTimestamp) {
                    latestTimestamp = currentTimestamp;
                    latestCusId = currentCusId;
                    // 将Date对象转回字符串格式,方便后续使用
                    mc.setProperty('Date', format.format(currentDate));
                } else {
                    // 保留已有的最新时间字符串
                    mc.setProperty('Date', mc.getProperty('Date'));
                }
                
                // 更新全局作用域的变量,供下一次迭代使用
                mc.setProperty('GLOBAL_LATEST_TIMESTAMP', latestTimestamp, 'synapse');
                mc.setProperty('GLOBAL_LATEST_CUS_ID', latestCusId, 'synapse');
                mc.setProperty('ID', latestCusId);
                
                log.info("当前最新时间戳对应的CustomerID: " + latestCusId);
                log.info("当前最新时间: " + mc.getProperty('Date'));
            ]]></script>
            
            <!-- 输出当前迭代后的最新结果 -->
            <log>
                <property expression="get-property('Date')" name="最新时间戳"/>
                <property expression="get-property('ID')" name="对应的CustomerID"/>
            </log>
        </sequence>
    </target>
</iterate>

关键说明

  • 跨迭代状态保留:将全局最新时间戳和ID存储在synapse作用域,确保<iterate>的多次迭代间能持续累积比较
  • 时间格式处理:使用SimpleDateFormat匹配输入格式,并统一时区为UTC避免时区差异导致的比较错误
  • 类型安全比较:将时间字符串解析为Date对象后,使用getTime()获取数值型时间戳进行比较,避免类型不匹配问题
  • 结果存储:将最终的最新时间转回字符串格式存回属性,方便后续流程直接使用

内容的提问来源于stack exchange,提问作者sathish Sankarzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:15:52