【问题标题】:Calling a method every Day, every Week , every month and every year每天、每周、每月和每年调用一个方法
【发布时间】:2013-02-08 21:02:34
【问题描述】:

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

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

我每天都在这样做:

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 时,它似乎工作正常第二天进行...

他们对我的代码有什么问题吗?

【问题讨论】:

    标签: java timer task alarm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我想你将不得不按照上面所说的 Marko Topolnik https://stackoverflow.com/a/14781326/2040095

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

          类似

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

          其中 period 是每日报告的 24 小时。

          【讨论】:

            【解决方案5】:

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

            希望这会有所帮助..

            【讨论】:

              猜你喜欢
              • 2011-05-30
              • 1970-01-01
              • 2017-09-26
              • 1970-01-01
              • 1970-01-01
              • 2020-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多