之前用eclipse有段代码是让每天一个固定的时间点发邮件的。有一次因为升级服务器把程序暂停。重启后就不能按照时间发邮件,而是每天在我重启它的那个时间发邮件了,百思不得其解,求帮助。代码段如下:
   Calendar date = Calendar.getInstance();
    date.set(
      Calendar.DAY_OF_WEEK,
      Calendar.TUESDAY
    );
    
    date.set(Calendar.AM_PM, Calendar.AM);
    date.set(Calendar.HOUR, 7);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);
               Timer timer_RDR = new Timer();
               timer_RDR.schedule(new RDR_Email(), date.getTime(), daily_period );这个Timer的运行有什么讲究吗?谢谢

解决方案 »

  1.   

    现在是7月18号上午9点,若把schedule时间设置为7月18号的0点,如果你9点启动服务器,那么会立即启动你的邮件发送程序代码我没有细看,我觉得可以从几个方面来解决这个问题schedule的时候要判断启动时的时间(start)与真正要发送邮件的时间(real)的关系,若start比real晚,那么今天可以发邮件,若start已经超过了real,则今天就不能再发邮件了,把delay推迟到明天该发的时候
      

  2.   

    上面写错了点:schedule的时候要判断启动时的时间(start)与真正要发送邮件的时间(real)的关系,若start比real,那么今天可以发邮件,若start已经超过了real,则今天就不能再发邮件了,把delay推迟到明天该发的时候
      

  3.   

    肯定是你的时间比较代码逻辑有问题 可以尝试用 spring的quartz 实现定时任务
      

  4.   

    Timer运行的时候,首先判断当天时间是否超过设定时间,如果超过,就先运行定时任务,如果没超过就等待到时间运行,根据这个特点,你可以在程序里判断当天的时间和定时的时间的关系:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
    Date date = new Date();//定义开始时间字符串
    String timeStr = jFmtTextField_ftpruntime.getText();
    timeStr = sdf.format(date) + timeStr;
    //获得当天的指定时间的date对象
    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    try {
        date = sdf.parse(timeStr);
    } catch (Exception e) {
    }//判断今天的执行时间是否已经过去,如果过去则改为明天
    String str=sdf.format(date);
    if (date.getTime() < System.currentTimeMillis()) {
        date = new Date(date.getTime() + 24 * 60 * 60 * 1000);
    }
    str=sdf.format(date);Timer timer = new Timer();
    timer.schedule(new MyTimerTask(), date, 24 * 60 * 60 * 1000);
    logger.info("开始执行定时任务... ....");
    showRunningDialog(timer);
      

  5.   

    schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。
      

  6.   

    schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后
      

  7.   


    谢谢,我先去试一下,关键已经在production了,不管随便弄了
      

  8.   


    我的代码里有好几个timer,一个是设每天早上7点,还有一个设每周一晚上11点。我弄了之后每周一晚上11点的那个也变成每周一早上8:39了,我是不是把程序关掉,在早上7点以前启动就可以了呢?
      

  9.   

    你的每个timer都按照我的方法判断下,什么时候启动都行............
      

  10.   

    timer.schedule(new MyTimerTask(), date, 24 * 60 * 60 * 1000);
    这个是每天运行一次,24 * 60 * 60 * 1000*7就是每周运行一次了............
      

  11.   

    谢谢各位,我把代码改成scheduleAtFixedRate就成功了,不过也用了wulan0010设置每周的方法,谢谢