使用ant部署到tomcat:如何知道应用程序何时重新加载?

时间:2015-12-14 12:22:21

标签: tomcat deployment ant

部署到tomcat 7的我的Spring MVC应用程序的当前ant构建过程如下(每一步都是目标):

  1. 将网站置于维护模式(这指示服务器上的nginx显示静态“维护”页面,而不是加载tomcat应用程序)
  2. 将战争复制到webapps目录下的Web服务器
  3. 等待tomcat重新加载应用程序
  4. 将网站恢复到生产模式(即,还原点1)
  5. 我的问题是目标3;我必须手动观察tail -f /var/log/tomcat7/catalina.out的输出,直到它显示消息说应用程序已重新加载。然后我必须手动启动目标点4。

    有没有办法让ant本身解析tail -f的输出,如果某个消息出现,请停止任务3并自动转到4号?

    注意:我仍然希望在控制台中看到tail -f的输出(如果有错误,调试信息很有用),我只是希望它停止并进入下一个目标,如果一切加载正确。

    编辑:

    稍微更新说我毕竟找到了令人满意的解决方案。下面的ant目标将拖尾catalina.out文件,在控制台中打印行并在输出中出现“Servlet context initialized”字样时退出命令(这是我的应用程序打印到系统输出时的消息)初始化)。

    <target name="tail catalina.out DEV until restart" depends="Get credentials for DEV">
        <property name="tailtime" value="4" />
        <sshexec host="${dev}" username="${username}" password="${password}" command="echo ${password}| sudo -S tail --lines=1 -f /var/log/tomcat7/catalina.out | while read LOGLINE; do echo &quot;${LOGLINE}&quot;;  [[ &quot;${LOGLINE}&quot; == *&quot;Servlet context initialized&quot;* ]] &amp;&amp; echo ${password}|sudo -S pkill -u root tail; done" failonerror="false" trust="true" />
    </target>
    

    因此,在运行此目标后,我知道应用程序已启动,我可以触发将该站点置于生产模式的下一个目标。

1 个答案:

答案 0 :(得分:0)

很难解决这个问题的方法就是这样:

  1. 我不知道如何在Spring中执行此操作,但是您可以创建一些简单的bean并在所有重载成功完成后强制它进行初始化。那个bean只能触摸一些文件(例如/ run / shm / reload-nginx)。
  2. 每次/ run / shm / reload-nginx修改日期更改时,inotify会触发您的脚本,例如:通过http://linux.die.net/man/1/inotifywait