我的需求是需要在如果服务器每次开启的时候执行一次动作,如果服务器一直开启,则每天8点整的时候执行一次动作。下面是我的Servlet代码,/*
 * 创建日期 2005-8-22
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package com.gever.cams.crm.util;import java.text.SimpleDateFormat;import javax.servlet.ServletContext;
import javax.servlet.ServletException;/**
 * @author Administrator
 * 
 * TODO 要更改此生成的类型注释的模板,请转至 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class RemindTest extends javax.servlet.http.HttpServlet {
    private final Scheduler scheduler = new Scheduler();    private final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "dd MMM yyyy HH:mm:ss.SSS");    private int hourOfDay = 0, minute = 0, second = 0;    public void init(javax.servlet.ServletConfig config)
            throws ServletException {
        try {
            super.init(config);            //服务器第一次开启自动检查一次
            aaa();            scheduler.schedule(new SchedulerTask() {                public void run() {
                    aaa();//每天8点执行一次
                }
            }, new DailyIterator(hourOfDay, minute, second));        } catch (Exception ex) {
            throw new ServletException(ex);        }
    }    void aaa() {
        System.out.println("aaaaaaaaaaaaaaaaaa测试提醒--------");
    }
}//web 配置<servlet>
  <servlet-name>RemindTest</servlet-name>
  <servlet-class>com.gever.cams.crm.util.RemindTest</servlet-class>
  <init-param>
   <param-name>hourofday</param-name>
   <param-value>8</param-value>
  </init-param>
  <init-param>
   <param-name>second</param-name>
   <param-value>0</param-value>
  </init-param>
  <init-param>
   <param-name>minute</param-name>
   <param-value>0</param-value>
  </init-param>
  <load-on-startup>200</load-on-startup>
 </servlet>
 

解决方案 »

  1.   

    用 Timer 定时器来操作。 ok的。public class Auto_Do {
      public Auto_Do() {    Timer tr = new Timer();
        Calendar cdr = Calendar.getInstance();    String s2DateNext = new java.text.SimpleDateFormat("yyyyMMdd").format(new
            java.util.Date());
        int year = Integer.parseInt(s2DateNext.substring(0, 4));
        int month = Integer.parseInt(s2DateNext.substring(4, 6));
        int day = Integer.parseInt(s2DateNext.substring(6, 8));    //设置第一次执行时间 凌晨 05:05:05
        cdr.set(Calendar.YEAR, year);
        cdr.set(Calendar.MONTH, month - 1);
        cdr.set(Calendar.DAY_OF_MONTH, day);
        cdr.set(Calendar.HOUR_OF_DAY, 05);
        cdr.set(Calendar.MINUTE, 05);
        cdr.set(Calendar.SECOND, 05);    //建立执行列表
        Do_YourWork do_it = new Do_YourWork();
        tr.schedule(do_it, cdr.getTime(), 24 * 60 * 60 * 1000);       
      }
      

  2.   

    你把两个都放进INIT里面了啊,那样一调用就当然都执行了
      

  3.   

    jintaocom(贫民张大嘴) 
    我现在就想用我这种方法来实现,应该是可以实现的吧,zengguiyeah(曾贵)
    不对,我把第一个aaa()方法注释掉,还是执行两次,
     kingfish(POWER OF JAVA) ( )
    我现在就只想要它执行一次,为什么说
    如果启动时定时器任务执行了1次说明你指定的时间可能有问题
      

  4.   

    目前实际情况是aaa()被调用了2次, 其中1次是你主动调用的, 哪另外一次是如何调用的?
    定时任务首次执行时间你设置的是今天8点还是明天8点, 如果是今天8点, 那么启动时间只要大于8点,定时器就会执行一次
      

  5.   

    运行2次因为你的web目录被容器2次加载造成的
    以tomcat为例子:
    比如你webapps目录下放了目录manager
    你在tomcat/conf/server.xml里又配置了一个context应用
    <context path="/" docbase="webapps/manager"/>
    这样在启动tomcat的时候就会造成2次初始化servlet了,你可以删掉这个context应用配置
    或者把manager目录放置在其他地方,就ok了
      

  6.   

    我用的是weblogic 哦,还是运行两次啊,
      

  7.   

    hykwolf(Yankang Hu)
    运行2次因为你的web目录被容器2次加载造成的
    以tomcat为例子:
    比如你webapps目录下放了目录manager
    你在tomcat/conf/server.xml里又配置了一个context应用
    <context path="/" docbase="webapps/manager"/>
    这样在启动tomcat的时候就会造成2次初始化servlet了,你可以删掉这个context应用配置
    或者把manager目录放置在其他地方,就ok了
    我照这位仁兄的说着去做了,但我的webapps目录下没有放manager目录,
    我把tomcat/conf/server.xml下的context删掉了,果然只执行了一次,但问题是一般来说别人的配置是否都象我这样把这个删掉呢???删掉会不会影响系统的其他部分呢???
      

  8.   

    而且我是用的weblogic,这样把它删掉是否也一样啊???
      

  9.   

    是否影响要看你在context节点里的属性配置,如果你做了特殊的配置,如连接池、session、线程等的控制,那么你删了context节点的话肯定会有影响,这样你就需要在web-inf/web.xml里补偿这些属性配置。或者你保留context节点的配置,然后把web目录放在一个其它的目录下,这个目录不能在tomcat的web应用目录中另外你还要注意你的server.xml里是可以指定其他目录为webapps目录的,或者你的多个context节点配置都应用到了你的web目录上,这样也可造成2次或多次运行。weblogic也一样,多检查一下配置文件,避免重复配置web应用
      

  10.   

    运行2次因为你的web目录被容器2次加载造成的
    以tomcat为例子:
    比如你webapps目录下放了目录manager
    你在tomcat/conf/server.xml里又配置了一个context应用
    <context path="/" docbase="webapps/manager"/>
    这样在启动tomcat的时候就会造成2次初始化servlet了,你可以删掉这个context应用配置
    或者把manager目录放置在其他地方,就ok了