有时候,你想让一个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");
}
}