TOMCAT中如何自动加载程序

 有时候,你想让一个ROBOT运行在TOMCAT中,并随TOMCAT启动而启动,怎么办?以下是解决办法:
一、理论
在类中,可以定义static代码,当类被首次加载时,自动执行其中的代码。例如:
  1. public class Test{
  2.     static{
  3.         //类被加载时执行的代码
  4.     }
  5.     
  6.     public Test(){
  7.     }
  8.     
  9.     ...
  10.     //其他方法
  11. }
在java中,当使用到一个类的时候,该类才会被加载到内存中。因此,如果上面的类Test没有被调用,那么其static部分的代码也不会被执行。

为了让程序代码在tomcat启动时自动运行,需要写一个servlet,在tomcat的web.xml中配置后,可以随tomcat启动而自动运行。在WEB-INFO/web.xml中,配置如下:

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <web-app>
  3. <servlet>
  4. <servlet-name>InitServlet</servlet-name>
  5. <servlet-class>InitServlet</servlet-class>
  6. <load-on-startup>25</load-on-startup>
  7. </servlet>
  8. <welcome-file-list>
  9. <welcome-file>login.jsp</welcome-file>
  10. </welcome-file-list>
  11. </web-app>
在这里,如果项目中已经有了servlet,自己重新建一个了。

关键是<servlet>与</servlet>之间的参数:<load-on-startup>。加了这个参数 后,tomcat启动时,会自动加载类com.ee2ee.servlet.TestAutoRun。在servlet类的init方法中放置需要自动执 行的代码即可。

以下是一个样本servlet:
  1. import javax.servlet.*;
  2. import javax.servlet.http.*;
  3. import java.io.*;
  4. import java.util.*;
  5.  
  6. public class InitServlet extends HttpServlet{
  7.  
  8.   /* (non-Javadoc)
  9.    * @see javax.servlet.GenericServlet#init()
  10.    */
  11.   public void init() throws ServletException {
  12.     // TODO Auto-generated method stub
  13.     Thread t=new Thread(){
  14.         public void run(){
  15.             try{
  16.                while(true){
  17.                   System.out.println("init begin");
  18.                   System.out.flush();
  19.                   sleep(10000);
  20.                }
  21.             }catch(Exception ex){}
  22.         }
  23.     };
  24.     t.start();
  25.   }
  26.  
  27.  
  28.   /* (non-Javadoc)
  29.    * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  30.    */
  31.   protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
  32.    throws ServletException, IOException {
  33.     // TODO Auto-generated method stub
  34.     //System.out.println(" init server begin");
  35.   }
  36. }

使用命令提示符下的STARTUP启动TOMCAT,就会显示控制台,在控制台上正确地输出了结果,每隔10秒钟系统自动输出:“init begin”。

二、实践

以下是项目中的ROBOT
  1. package ql.sbs.tools;
  2.  
  3. import quanwen.*;
  4. import ql.sbs.bus.*;
  5.  
  6. import javax.servlet.*;
  7. import javax.servlet.http.*;
  8. import java.util.*;
  9. import java.io.*;
  10. import sun.io.*;
  11. import java.sql.*;
  12.  
  13. /**
  14.  * 自动入库工具
  15.  * 2005.6.25
  16.  * qixiaorui
  17.  */
  18. public class AutoDBServlet extends HttpServlet{
  19.  
  20.   public LocalLang ll;
  21.   /* (non-Javadoc)
  22.    * @see javax.servlet.GenericServlet#init()
  23.    */
  24.   public void init() throws ServletException {
  25.     // TODO Auto-generated method stub
  26.     try{
  27.       //在服务器端建立目录结构
  28.       File d=new File("c:/aa");
  29.       if(!d.exists()){
  30.         d.mkdir();
  31.       }
  32.       File d1=new File("c:/aa/ini");
  33.       if(!d1.exists()){
  34.         d1.mkdir();
  35.       }
  36.       //将JAR中的三个文件拷贝到目录中c aa ini
  37.       String name="/Lang_chi.txt";
  38.       copyToDisk(name,"c:/aa/ini");
  39.       name="/Lang_eng.txt";
  40.       copyToDisk(name,"c:/aa/ini");
  41.       name="/SBS.ini";
  42.       copyToDisk(name,"c:/aa/ini");
  43.         
  44.       //获取语言文件
  45.       INIOperate ini=new INIOperate(new File("c:/aa/ini/SBS.ini"),20,"   ;");
  46.       String language="c:/aa/ini/"+"Lang_"+ini.getItem("语言/language")+".txt";
  47.       ll=new LocalLang(language);
  48.     }catch(Exception ex){
  49.       System.out.println(ex.toString());
  50.     }
  51.  
  52.     Thread t=new Thread(){
  53.         BusObject bo=new BusObject();
  54.         FDBPublic pub=new FDBPublic();
  55.         String path="c://aa//tmp//";
  56.         String strTXTFile="";
  57.         String strINIFile="";
  58.         long currentID=0;  //记录当前编号
  59.         String sql="";
  60.         long currentID1=0;  //处理的记录在临时表中的编号
  61.         public void run(){
  62.             try{
  63.               while(true){
  64.                   //这个休眠时间需要通过实践根据实际的处理情况进行修改,但最少要保证在
  65.                   //这个时间内能处理完一条记录。
  66.                   sleep(10000);
  67.                   sql="select ID,userID,number,inDay "+
  68.                              "from SBSReceiveFile "+
  69.                              "where endFlag='T'";
  70.                   String usID="";
  71.                   int number=0;
  72.                   String inDay="";
  73.                   MDBClass mdb=new MDBClass();
  74.                   mdb.connect();
  75.                   ResultSet rs=mdb.executeQuery(sql);
  76.                   if(rs.next()){
  77.                      currentID1=rs.getLong("ID");
  78.                      usID=rs.getString("userID");
  79.                      number=rs.getInt("number");
  80.                      inDay=rs.getString("inDay");
  81.                      rs.close();
  82.                      mdb.closeAll();
  83.                      toDB(usID,number,inDay);
  84.                   }else{
  85.                     rs.close();
  86.                     mdb.closeAll();
  87.                   }
  88.                }
  89.             }catch(Exception ex){}
  90.         }
  91.         //插入一条记录,记录可以用用户编号+顺号+日期来唯一的区别。
  92.         public void toDB(String usID,int number,String daytime){
  93.           //注意,不要随便移动语句的处理顺序,因为许多公用变量在第一个函数里被
  94.           //赋值,其他紧随的函数使用了这些变量!!
  95.  
  96.           //将记录插入SBSArticle  OK!
  97.           toArticle(usID,number,daytime);
  98.           //如果有主记录,插入到SBSPicNews表
  99.           toPicNews(usID,number,daytime);
  100.           //处理全文内容
  101.           toContent(usID,number,daytime);
  102.           //处理图片内容
  103.           toPicture(usID,number,daytime);
  104.           //处理附件内容
  105.           toPaste(usID,number,daytime);
  106.           //把相应的文本文件和配置文件删除
  107.           deleteTXTINIFile(usID,number,daytime);
  108.           //删除掉SBSReceiveFile中相关项目  OK!       
  109.           deleteCurrent();
  110.         }
  111. ………..
  112.     /* (non-Javadoc)
  113.    * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  114.    */
  115.   protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
  116.    throws ServletException, IOException {
  117.     // TODO Auto-generated method stub
  118.     //System.out.println(" init server begin");
  119.   }
  120. }




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值