设为首页 收藏本站
查看: 331|回复: 0

[经验分享] Java实现tomcat启动时自动运行代码

[复制链接]

尚未签到

发表于 2017-2-3 08:28:44 | 显示全部楼层 |阅读模式
方法1:tomcat 自动执行servlet
写一个servlet,在init()方法中写好想要执行的程序,程序如下:
eclipse新建一个web\Dynamic Web Project , name = myweb1 , 把tomcat中的 servlet-api.jar复制到lib中,新建一个类MyServlet.java, 继承 javax.servlet.HttpServlet,代码如下:
package org.cai;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
public class MyServlet extends HttpServlet {  
@Override  
public void init() throws ServletException {  
// TODO Auto-generated method stub  
super.init();  
System.out.println("自动加载启动.");  
System.out.println("自动加载启动.");  
for(int i = 0; i < 10; i++){  
System.out.println(i + "、 自动加载启动.");  
}  
}  

}  

同时,在web.xml配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
<display-name>myweb1</display-name>  
<welcome-file-list>  
<welcome-file>index.jsp</welcome-file>  
</welcome-file-list>  
<servlet>  
<servlet-name>MyServlet</servlet-name>  
<servlet-class>org.cai.MyServlet</servlet-class>  
<strong><load-on-startup>0</load-on-startup></strong>  
</servlet>  
<servlet-mapping>  
<servlet-name>MyServlet</servlet-name>  
<url-pattern>/</url-pattern>  
</servlet-mapping>  
</web-app>     

其中<load-on-startup>0</load-on-startup>即可实现tomcat启动时执行该servlet
load-on-startup的值必须为整数
当load-on-startup值为负整数或者未指定时,容器在该servlet被调用时加载
当其值为0和正整数时,容器启动时加载,值越小,优先级越高
使用虚拟路径部署到tomcat中:在 tomcat的 server.xml的 </Host>前加入:
<Context debug="0" docBase="F:/studyworkspace/myweb1/WebRoot" path="myweb1" reloadable="true">
     </Context>

docBase为 myweb1的webroot的路径 ,path为上下文
方法2:Servlet侦听器
要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。
listener类如下:
package org.cai;  
import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;  
public class MyListener implements ServletContextListener {  
private java.util.Timer timer = null ;  
public void contextDestroyed(ServletContextEvent event) {  
// TODO Auto-generated method stub  
}  
public void contextInitialized(ServletContextEvent event) {  
timer = new java.util.Timer(true) ;  
event.getServletContext().log("定时器已启动。") ;  
timer.schedule(new MyTask(event.getServletContext()), 0, 5000) ;  
event.getServletContext().log("已经添加任务调度表。" ) ;  
}  
}  
contextInitialized函数里的内容将被自动执行
最后在web.xml里面添加一个监听节点就行了
  <listener>
   <listener-class>org.cai.MyListener</listener-class>
  </listener>
完整web.xml如下
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
<display-name>myweb2</display-name>  
<welcome-file-list>  
<welcome-file>index.jsp</welcome-file>  
</welcome-file-list>  
<listener>  
<listener-class>org.cai.MyListener</listener-class>  
</listener>  
</web-app>  

如果要执行定时任务,就在自动执行的代码里面使用 java.util.Timer以及创建一个继承java.util.TimerTask的类。示例:
package org.cai;  
import java.util.TimerTask;  
import javax.servlet.ServletContext;  
public class MyTask extends TimerTask {  
private static boolean isRunning = false;   
private ServletContext context = null;   
public MyTask(ServletContext context){  
this.context = context ;  
}  
@Override  
public void run() {  
if (! isRunning){  
System.out.println("开始执行指定任务.") ;  
//if (C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {  
isRunning = true ;  
context.log("开始执行指定任务.") ;  
//TODO 添加自定义的详细任务,以下只是示例   
int i = 0;   
while (i++ < 10) {   
context.log("已完成任务的" + i + "/" + 10);   
//System.out.println("已完成任务的" + i + "/" + 1000) ;  
}   
isRunning = false;   
context.log("指定任务执行结束");   
System.out.println("指定任务执行结束") ;  
//}  
}else{  
context.log("上一次任务执行还未结束");   
}  
}  
}  

以上两种方法部署到tomcat,运行tomcat\bin\startup.bat,即可看到效果,其中方法2中的日志写入到tomcat\logs\localhost.xxxx-xx-xx.log文件中。
方法3:如果要spring启动后立即执行指定的函数  
spring启动后立即执行指定的函数只需要在spring配置文件中增加一个init-method属性即可
<bean id="test" class="com.zhy.demo.test" init-method="start" />

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-336770-1-1.html 上篇帖子: 项目打包成war包放入tomcat中运行 下篇帖子: 手机访问电脑中部署的tomcat应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表