TOMCAT中如何自动加载程序

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

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

≤?xml version="1.0" encoding="GB2312"?≥
≤web-app≥
≤servlet≥
≤servlet-name≥InitServlet≤/servlet-name≥
≤servlet-class≥InitServlet≤/servlet-class≥
≤load-on-startup≥25≤/load-on-startup≥
≤/servlet≥
≤welcome-file-list≥
≤welcome-file≥login.jsp≤/welcome-file≥
≤/welcome-file-list≥
≤/web-app≥
在这里,如果项目中已经有了servlet,自己重新建一个了。

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

以下是一个样本servlet: 
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
 
public class InitServlet extends HttpServlet{
 
 
  public void init() throws ServletException {
    // TODO Auto-generated method stub
    Thread t=new Thread(){
        public void run(){
            try{
               while(true){
                  System.out.println("init begin");
                  System.out.flush();
                  sleep(10000);
               }
            }catch(Exception ex){}
        }
    };
    t.start();
  }
 
 
 
  protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
   throws ServletException, IOException {
    // TODO Auto-generated method stub
    //System.out.println(" init server begin");
  }
}

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

二、实践 

以下是项目中的ROBOT 
package ql.sbs.tools;
 
import quanwen.*;
import ql.sbs.bus.*;
 
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;
import sun.io.*;
import java.sql.*;
 
public class AutoDBServlet extends HttpServlet{
 
  public LocalLang ll;
 
  public void init() throws ServletException {
    // TODO Auto-generated method stub
    try{
      //在服务器端建立目录结构
      File d=new File("c:/aa");
      if(!d.exists()){
        d.mkdir();
      }
      File d1=new File("c:/aa/ini");
      if(!d1.exists()){
        d1.mkdir();
      }
      //将JAR中的三个文件拷贝到目录中c aa ini
      String name="/Lang_chi.txt";
      copyToDisk(name,"c:/aa/ini");
      name="/Lang_eng.txt";
      copyToDisk(name,"c:/aa/ini");
      name="/SBS.ini";
      copyToDisk(name,"c:/aa/ini");
        
      //获取语言文件
      INIOperate ini=new INIOperate(new File("c:/aa/ini/SBS.ini"),20,"   ;");
      String language="c:/aa/ini/"+"Lang_"+ini.getItem("语言/language")+".txt";
      ll=new LocalLang(language);
    }catch(Exception ex){
      System.out.println(ex.toString());
    }
 
    Thread t=new Thread(){
        BusObject bo=new BusObject();
        FDBPublic pub=new FDBPublic();
        String path="c://aa//tmp//";
        String strTXTFile="";
        String strINIFile="";
        long currentID=0;  //记录当前编号
        String sql="";
        long currentID1=0;  //处理的记录在临时表中的编号
        public void run(){
            try{
              while(true){
                  //这个休眠时间需要通过实践根据实际的处理情况进行修改,但最少要保证在
                  //这个时间内能处理完一条记录。
                  sleep(10000);
                  sql="select ID,userID,number,inDay "+
                             "from SBSReceiveFile "+
                             "where endFlag='T'";
                  String usID="";
                  int number=0;
                  String inDay="";
                  MDBClass mdb=new MDBClass();
                  mdb.connect();
                  ResultSet rs=mdb.executeQuery(sql);
                  if(rs.next()){
                     currentID1=rs.getLong("ID");
                     usID=rs.getString("userID");
                     number=rs.getInt("number");
                     inDay=rs.getString("inDay");
                     rs.close();
                     mdb.closeAll();
                     toDB(usID,number,inDay);
                  }else{
                    rs.close();
                    mdb.closeAll();
                  }
               }
            }catch(Exception ex){}
        }
        //插入一条记录,记录可以用用户编号+顺号+日期来唯一的区别。
        public void toDB(String usID,int number,String daytime){
          //注意,不要随便移动语句的处理顺序,因为许多公用变量在第一个函数里被
          //赋值,其他紧随的函数使用了这些变量!!
 
          //将记录插入SBSArticle  OK!
          toArticle(usID,number,daytime);
          //如果有主记录,插入到SBSPicNews表
          toPicNews(usID,number,daytime);
          //处理全文内容
          toContent(usID,number,daytime);
          //处理图片内容
          toPicture(usID,number,daytime);
          //处理附件内容
          toPaste(usID,number,daytime);
          //把相应的文本文件和配置文件删除
          deleteTXTINIFile(usID,number,daytime);
          //删除掉SBSReceiveFile中相关项目  OK!       
          deleteCurrent();
        }
………..
   
  protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
   throws ServletException, IOException {
    // TODO Auto-generated method stub
    //System.out.println(" init server begin");
  }
}
原文地址:https://www.cnblogs.com/luckForever/p/7254290.html