有时候,你想让一个ROBOT运行在TOMCAT中,并随TOMCAT启动而启动,怎么办?以下是解决办法:
一、理论
在类中,可以定义static代码,当类被首次加载时,自动执行其中的代码。例如:
在java中,当使用到一个类的时候,该类才会被加载到内存中。因此,如果上面的类Test没有被调用,那么其static部分的代码也不会被执行。
为了让程序代码在tomcat启动时自动运行,需要写一个servlet,在tomcat的web.xml中配置后,可以随tomcat启动而自动运行。在WEB-INFO/web.xml中,配置如下:
关键是<servlet>与</servlet>之间的参数:<load-on-startup>。加了这个参数后,tomcat启动时,会自动加载类com.ee2ee.servlet.TestAutoRun。在servlet类的init方法中放置需要自动执行的代码即可。
以下是一个样本servlet:
使用命令提示符下的STARTUP启动TOMCAT,就会显示控制台,在控制台上正确地输出了结果,每隔10秒钟系统自动输出:“init begin”。
二、实践
以下是项目中的ROBOT
一、理论
在类中,可以定义static代码,当类被首次加载时,自动执行其中的代码。例如:
1 | public class Test{ static{ //类被加载时执行的代码 } public Test(){ } ... //其他方法 } |
在java中,当使用到一个类的时候,该类才会被加载到内存中。因此,如果上面的类Test没有被调用,那么其static部分的代码也不会被执行。
为了让程序代码在tomcat启动时自动运行,需要写一个servlet,在tomcat的web.xml中配置后,可以随tomcat启动而自动运行。在WEB-INFO/web.xml中,配置如下:
1 | <?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:
1 | 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
1 | 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"); } } |