0

我需要在特定时间自动向我的客户发送报告,例如

  • 每天上午 00:01
  • 每周日 00:01 AM
  • 每个月的第一天
  • 每年的第一天

我每天都在这样做:

public void contextInitialized(ServletContextEvent arg0) {

        System.out.println("context initiallized");
        System.out.println("Starting timer");

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 1);
        calendar.set(Calendar.SECOND, 0);

        Date alarmTime = calendar.getTime();

        _timer = new Timer();
        _timer.schedule(new AlarmTask(), alarmTime);
    }

这是我执行日常任务的课程:

public class AlarmTask extends TimerTask {

    public void run() {
        // Do your work here; it's 00:01 AM!         
    }
}

它似乎工作正常 但是 当我在凌晨 00:01 之后的任何时间启动 tomcat 说在凌晨 02:30 时,任务在加载上下文后立即执行,我需要在第二天执行它......

他们对我的代码有任何问题吗?

4

5 回答 5

3

你为什么不使用 QuartzSchedular http://quartz-scheduler.org/

于 2013-02-08T21:05:42.677 回答
2

Calendar模拟完整日期,以便您在过去安排。Timer将通过立即执行来响应。在 上增加天数Calendar

于 2013-02-08T21:04:48.503 回答
1

你看过石英吗?它可以帮助您安排任务!

于 2013-02-08T21:06:29.357 回答
0

如果您在大型项目中执行此操作,我更喜欢您使用Quartz Schedular,因为它有一个用户界面来处理作业以及创建和编辑作业。如果它只是一个必须定期执行的小警报任务,请创建一个批处理文件并将其添加到chron作业以在特定时间间隔运行。

希望这会有所帮助..

于 2013-03-05T14:16:01.063 回答
0

我想你必须按照 Marko Topolnik 上面所说的去做https://stackoverflow.com/a/14781326/2040095

但此外,您是否还需要为 Timer 类调用方法“计划”的 3 个参数形式,因为您需要每天发送此报告,而不仅仅是一天?

所以像

_timer.schedule(new AlarmTask(), alarmTime, period );

对于每日报告,期间将是 24 小时。

于 2013-02-08T21:30:43.067 回答