【问题标题】:Ant-contrib foreach task - last value in the listAnt-contrib foreach 任务 - 列表中的最后一个值
【发布时间】:2014-03-17 01:40:56
【问题描述】:

我目前正在使用 foreach ant 任务执行部署,并且该列表具有应用服务器名称(2 个服务器)。在移动到下一个应用服务器之前,有一个逻辑要等待 2 分钟(睡眠)。

逻辑工作正常,但即使在第二个(最后一个)应用服务器之后也应用了睡眠,这增加了 2 分钟。

有没有办法找到我已经达到列表中的最后一个值?这样我就可以不用等待就退出了。

sl.app.server.list=lstrdrasv01.str.staples.com

<foreach list="${sl.app.server.list}" param="sl.app.server" target="Storelocator.app.deploy" parallel="false" inheritall="true"/>

<sshexec host="${sl.app.server}" 
                username="${sl.app.username}" 
                password="${sl.as.password}"
                trust="true"
                output="output"
                command="${start}"/>

    <echo message="Waiting for Rolling deploy 2 min..."/>   
            <sleep seconds="120"/>

    </target>

在我的列表包含 2 个服务器的情况下,睡眠执行了 2 次,理想情况下它应该只睡眠 1 次,因为在第二个服务器之后没有更多的服务器。

【问题讨论】:

  • 你能告诉我们你的build.xml吗?信息这么少,很难帮到你。
  • 我已经添加了代码逻辑。整个文件太大,只是发布的需要帮助的部分。谢谢!

标签: ant ant-contrib


【解决方案1】:

您应该使用for 而不是foreach,因为foreach 使用antcall 而for 使用macrodef。
注意:与 antcontrib1.0b2 一起使用,最新版本的 antcontrib1.0b3 有一些错误,将失败:

BUILD FAILED
if doesn't support the nested "isgreaterthan" element.

一个带有 for 的解决方案,不需要额外的目标,所有工作都在顺序中完成:

    <project>
    <!-- Import AntContrib -->
    <taskdef resource="net/sf/antcontrib/antlib.xml" />

    <property name="sl.app.server.list" value="server1,server2"/>
    <!-- make use of jdk builtin javascript engine (since jdk 1.6.0_06) -->
    <script language="javascript">
     project.setProperty('serveritems', project.getProperty("sl.app.server.list").split(',').length);
    </script>

    <for list="${sl.app.server.list}" param="server" delimiter=",">
     <sequential>
      <echo>
       Remaining $${serveritems} => ${serveritems}
       process Server : @{server}
      </echo>

      <!--
       NOTE : you have to use @{..} syntax here !
       <sshexec host="@{server}" ...
      -->

      <if>
       <isgreaterthan arg1="${serveritems}" arg2="1"/>
        <then>
         <echo>Waiting for Rolling deploy 2 min...</echo>
         <sleep seconds="120"/>
        </then>
      </if>

      <!-- this doesn't work correctly, note the output
       Remaining ${serveritems} => -1 in second loop -->
      <!--
      <math result="serveritems" operand1="${serveritems}" operation="-" operand2="1" datatype="int"/>
      -->
      <!-- decrease serveritems -->
      <script language="javascript">
       project.setProperty('serveritems', parseInt(project.getProperty('serveritems')) - 1);
      </script>
     </sequential>
    </for>
    </project>

输出错误的工作 &lt;math result ... /&gt; 以减少服务器项:

[echo]         Remaining ${serveritems} => 2
[echo]         process Server : server1
[echo]     
[echo] Waiting for Rolling deploy 2 min...
[echo]         Remaining ${serveritems} => -1
[echo]         process Server : server2
[echo] 

使用脚本语言 javascript 输出减少服务器项:

 [echo]    Remaining ${serveritems} => 2
 [echo]    process Server : server1
 [echo]   
 [echo] Waiting for Rolling deploy 2 min...
 [echo]    Remaining ${serveritems} => 1
 [echo]    process Server : server2
 [echo] 

最后 => 请注意使用 @{..} 进行参数替换,就像在顺序的宏定义中一样!

【讨论】:

  • 非常感谢,我试试这个!
  • 关于 1.0b2 差异的重要提示。为我解决了。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多