• 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");
      }
    }
  • 相关阅读:
    deepin linux手工更新系统
    redis使用redis-cli查看所有的keys及清空所有的数据
    使用浏览器地址栏调用CXF Webservice的写法
    windows 80端口被占用
    How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7
    CAS 单点登录流程
    Restful是什么,SOAP Webservice和RESTful Webservice
    SpringMVC中的@PathVariable
    VMWare安装苹果操作系统OS X
    eclipse(adt-bundle)的Android SDK Manager下载不了谷歌的东西怎么办?
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254290.html
Copyright © 2020-2023  润新知