实现tomcat启动时自动运行代码_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2038 | 回复: 0   主题: 实现tomcat启动时自动运行代码        下一篇 
zhsgood
注册用户
等级:列兵
经验:102
发帖:70
精华:0
注册:2011-11-28
状态:离线
发送短消息息给zhsgood 加好友    发送短消息息给zhsgood 发消息
发表于: IP:您无权察看 2015-4-29 11:03:51 | [全部帖] [楼主帖] 楼主

方法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;
publicclass MyServlet extends HttpServlet {
      @Override
      publicvoid 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配置文件内容如下:

    <?xmlversion="1.0"encoding="UTF-8"?>
    <web-appxmlns: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;
publicclass MyListener implements ServletContextListener {
      private java.util.Timer timer = null ;
      publicvoid contextDestroyed(ServletContextEvent event) {
            // TODO Auto-generated method stub
      }
      publicvoid 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如下

<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns: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文件中。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论