Austin Moore
Austin Moore

Reputation: 1412

Running a Java method at a set time each day

I'm relatively new to Java and I've pick up a project to work on. However, I've run into a block. I need a method to run at a certain times throughout the day. I've done quite a bit of searching but I can't find anything that seems like it would do the trick. I've run into the Timer class but it appears to run at certain intervals. The Scheduler class, appeared to have the same issue. I also came across Quartz but I think I need something more lightweight and I could only see how to do things at intervals.

Perhaps, just because I'm new, I've missed some things that could help me in these classes, but I'm really stuck and could use some help.

If someone could point me to a class that will run something at a certain time of day, everyday (bonus points for being able to cancel the event), and show me how to correctly use the class, that would be awesome!

TL;DR: Need a class that does something at a time of day, not at an interval because the program may be restarted multiple times throughout the day.

Upvotes: 18

Views: 35704

Answers (3)

dov.amir
dov.amir

Reputation: 11637

try the TimerTask class

for more info check out http://oreilly.com/java/archive/quartz.html

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class ReportGenerator extends TimerTask {

  public void run() {
    System.out.println("Generating report");
    //TODO generate report
  }

}

class MainApplication {

  public static void main(String[] args) {
    Timer timer = new Timer();
    Calendar date = Calendar.getInstance();
    date.set(
      Calendar.DAY_OF_WEEK,
      Calendar.SUNDAY
    );
    date.set(Calendar.HOUR, 0);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);
    // Schedule to run every Sunday in midnight
    timer.schedule(
      new ReportGenerator(),
      date.getTime(),
      1000 * 60 * 60 * 24 * 7
    );
  }//Main method ends
}//MainApplication ends

Upvotes: 32

Richard Corfield
Richard Corfield

Reputation: 717

One possibility could be to use an external scheduler - depending on desired accuracy. On UNIX use CRON, on Windows use the Windows Scheduler. That nicely isolates timing from doing.

You could use a Timer and create a simple class that checks the time every minute or 5 minutes depending on desired granularity. It would be very lightweight.

Upvotes: 2

paulsm4
paulsm4

Reputation: 121599

I'd strongly suggest, if at all possible, that the best approach would be to invoke your script or Java application using your OS's scheduler: for example, "cron" in *nix, or "task scheduler" in Windows.

Upvotes: 5

Related Questions