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