JavaWeb 服务启动时,在后台启动加载一个线程或加载一个程序


昨天老大分了个任务,让我监控web站的异常,记录所有方法调用情况并存入数据库如果发现异常就发邮件给负责人,所以我研究了一下决定试试能不能用线程解决(我是没毕业也没用过线程的小白),这是我看了别人的博客为了防止忘记写下来。

原文博客地址:http://blog.csdn.net/it_wangxiangpan/article/details/7168286

两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet。第三种配置一个servlet项目开始时直接运行那个类的main方法

1.使用Servlet,在项目启动的时候启动它。

首先我要在web.xml下配置一个servlet来监控或者调用

  1. <!-- LISTENER FOR THREAD -->  
  2. <servlet>  
  3.     <servlet-name>MyListener</servlet-name>  
  4.     <servlet-class>com.ite.wxp.MyServlet</servlet-class>  
  5.     <load-on-startup>9</load-on-startup><!-- 数字越小,启动的优先级越高,必须大于0 -->  
  6. </servlet>  
  7. <servlet-mapping>    
  8.         <servlet-name>MyListener</servlet-name>    
  9.         <url-pattern>/test</url-pattern>     
  10. </servlet-mapping>  

然后创建一个Servlet,继承HttpServlet:

  1. package com.wxp.thread;  
  2. import java.io.IOException;  
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import com.ite.common.Constants;  
  8. public class MyServlet extends HttpServlet{  
  9. private static final long serialVersionUID = 1L;  
  10. private MyThread1 myThread1;  
  11. public MyServlet(){  
  12.     }  
  13. public void init(){  
  14.         String str = null;  
  15. if (str == null && myThread1 == null) {  
  16.             myThread1 = new MyThread1();  
  17.             myThread1.start(); // servlet 上下文初始化时启动 socket  
  18.         }  
  19.     }  
  20. public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)  
  21. throws ServletException, IOException{  
  22.     }  
  23. public void destory(){  
  24. if (myThread1 != null && myThread1.isInterrupted()) {  
  25.             myThread1.interrupt();  
  26.         }  
  27.     }  
  28. }  
  29. /** 
  30.  * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据 
  31.  *  
  32.  * @author Champion.Wong 
  33.  *  
  34.  */  
  35. class MyThread1 extends Thread {  
  36. public void run() {  
  37. while (!this.isInterrupted()) {// 线程未中断执行循环  
  38. try {  
  39.                 Thread.sleep(2000);  
  40.             } catch (InterruptedException e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43. // ------------------ 开始执行 ---------------------------  
  44.             System.out.println("____FUCK TIME:" + System.currentTimeMillis());  
  45.         }  
  46.     }  
  47. }   

其中,Listener的方式,该线程肯定是项目中首先启动的,优先于任何一个Servlet。而Servlet的方式,可以设置与其它Servlet启动的顺序。如果有时候需要首先启动一个Servlet或者它们之间的启动顺序有特殊要求的时候,这个就很有作用了。

2.监听(Listener)
首先,我们创建一个监听的类,继承ServletContextListener,如下:

  1. package com.wxp.thread;  
  2. import java.io.IOException;  
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import com.ite.common.Constants;  
  8. public class MyServlet extends HttpServlet{  
  9. private static final long serialVersionUID = 1L;  
  10. private MyThread1 myThread1;  
  11. public MyServlet(){  
  12.     }  
  13. public void init(){  
  14.         String str = null;  
  15. if (str == null && myThread1 == null) {  
  16.             myThread1 = new MyThread1();  
  17.             myThread1.start(); // servlet 上下文初始化时启动 socket  
  18.         }  
  19.     }  
  20. public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)  
  21. throws ServletException, IOException{  
  22.     }  
  23. public void destory(){  
  24. if (myThread1 != null && myThread1.isInterrupted()) {  
  25.             myThread1.interrupt();  
  26.         }  
  27.     }  
  28. }  
  29. /** 
  30.  * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据 
  31.  *  
  32.  * @author Champion.Wong 
  33.  *  
  34.  */  
  35. class MyThread1 extends Thread {  
  36. public void run() {  
  37. while (!this.isInterrupted()) {// 线程未中断执行循环  
  38. try {  
  39.                 Thread.sleep(2000);  
  40.             } catch (InterruptedException e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43. // ------------------ 开始执行 ---------------------------  
  44.             System.out.println("____FUCK TIME:" + System.currentTimeMillis());  
  45.         }  
  46.     }  
  47. }  

然后,在web.xml中配置

  1. <!-- LISTENER FOR THREAD -->  
  2. <servlet>  
  3. <servlet-name>MyListener</servlet-name>  
  4. <servlet-class>com.ite.wxp.MyServlet</servlet-class>  
  5. <load-on-startup>9</load-on-startup><!-- 数字越小,启动的优先级越高,必须大于0 -->  
  6. </servlet>  
  7. <servlet-mapping>    
  8. <servlet-name>MyListener</servlet-name>    
  9. <url-pattern>/test</url-pattern>     
  10. </servlet-mapping

3.运行程序的main方法(Listener)

1:首先让你要自动运行的类继承

 

javax.servlet.http.HttpServlet

2:把你要自动运行的类中写一个main方法。(Java应用程序启动的入口就是main方法)

public static void main(String args[]){

            System.out.println("这样在web容器启动的时候,,就会执行这句话了!");

}

3:在web.xml中新建一个servlet,如下:

  <servlet>
   <servlet-name>GenerateData</servlet-name>
   <servlet-class>com.yq.javaSCADA.business.impl.GenerateData</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

4:启动的web服务器,tomcat,weblogic,jboss,就会自动运行你类中的main方法了。

 

注:web项目中,servlet才是底层最精华的东西!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM