设为首页 收藏本站
查看: 605|回复: 0

[经验分享] TOMCAT中如何自动加载程序

[复制链接]

尚未签到

发表于 2017-1-31 08:57:29 | 显示全部楼层 |阅读模式
有时候,你想让一个ROBOT运行在TOMCAT中,并随TOMCAT启动而启动,怎么办?以下是解决办法:
一、理论
在类中,可以定义static代码,当类被首次加载时,自动执行其中的代码。例如:
查看复制到剪切板打印





  • public class Test{   

  •     static{   

  •             //类被加载时执行的代码   
  •     }       

  •     public Test(){   
  •     }       
  •     ...   

  •     //其他方法   
  • }  



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>  



<?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>之间的参数:<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{   
  •   

  •   /* (non-Javadoc)  
  •    * @see javax.servlet.GenericServlet#init()  
  •    */  

  •   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();   
  •   }   
  •   
  •   

  •   /* (non-Javadoc)  
  •    * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)  
  •    */  

  •   protected void service(HttpServletRequest arg0, HttpServletResponse arg1)   

  •    throws ServletException, IOException {   

  •     // TODO Auto-generated method stub   

  •     //System.out.println(" init server begin");   
  •   }   
  • }  



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class InitServlet extends HttpServlet{
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
*/
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();
}

/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
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.*;   
  •   

  • /**  
  • * 自动入库工具  
  • * 2005.6.25  
  • * qixiaorui  
  • */  

  • public class AutoDBServlet extends HttpServlet{   
  •   

  •   public LocalLang ll;   

  •   /* (non-Javadoc)  
  •    * @see javax.servlet.GenericServlet#init()  
  •    */  

  •   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();   
  •         }   
  • ………..   

  •     /* (non-Javadoc)  
  •    * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)  
  •    */  

  •   protected void service(HttpServletRequest arg0, HttpServletResponse arg1)   

  •    throws ServletException, IOException {   

  •     // TODO Auto-generated method stub   

  •     //System.out.println(" init server begin");   
  •   }   
  • }  



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.*;
/**
* 自动入库工具
* 2005.6.25
* qixiaorui
*/
public class AutoDBServlet extends HttpServlet{
public LocalLang ll;
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
*/
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();
}
………..
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
//System.out.println(" init server begin");
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335563-1-1.html 上篇帖子: Eclipse的Tomcat热部署,免重启的方法 下篇帖子: tomcat项目移植到weblogic问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表