it-swarm.com.de

Wie plane ich eine periodische Aufgabe in Java?

Ich muss eine Aufgabe einplanen, die in einem festgelegten Zeitintervall ausgeführt wird. Wie kann ich dies mit Unterstützung langer Intervalle tun (zum Beispiel alle 8 Stunden)?

Ich verwende derzeit Java.util.Timer.scheduleAtFixedRate. Unterstützt Java.util.Timer.scheduleAtFixedRate lange Zeitintervalle? 

149
RYN

Verwenden Sie einen ScheduledExecutorService :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
217
b_erb

Sie sollten einen Blick auf Quartz werfen. Dies ist ein Java-Framework, das mit EE- und SE-Editionen arbeitet und Jobs zur Ausführung einer bestimmten Zeit definiert

41
Jorge

Versuchen Sie es auf diese Weise ->

Erstellen Sie zunächst eine Klasse TimeTask, die Ihre Aufgabe ausführt. Es sieht so aus:

public class CustomTask extends TimerTask  {

   public CustomTask(){

     //Constructor

   }

   public void run() {
       try {

         // Your task process

       } catch (Exception ex) {
           System.out.println("error running thread " + ex.getMessage());
       }
    }
}

dann in der Hauptklasse instanziieren Sie die Aufgabe und führen Sie sie regelmäßig aus, die zu einem bestimmten Datum gestartet wird:

 public void runTask() {

        Calendar calendar = Calendar.getInstance();
        calendar.set(
           Calendar.DAY_OF_WEEK,
           Calendar.MONDAY
        );
        calendar.set(Calendar.HOUR_OF_DAY, 15);
        calendar.set(Calendar.MINUTE, 40);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);



        Timer time = new Timer(); // Instantiate Timer Object

        // Start running the task on Monday at 15:40:00, period is set to 8 hours
        // if you want to run the task immediately, set the 2nd parameter to 0
        time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}
21
Shessuky

Verwenden Sie Google Guava AbstractScheduledService wie unten angegeben:

public class ScheduledExecutor extends AbstractScheduledService
{
   @Override
   protected void runOneIteration() throws Exception
   {
      System.out.println("Executing....");
   }

   @Override
   protected Scheduler scheduler()
   {
        return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
   }

   @Override
   protected void startUp()
   {
       System.out.println("StartUp Activity....");
   }


   @Override
   protected void shutDown()
   {
       System.out.println("Shutdown Activity...");
   }

   public static void main(String[] args) throws InterruptedException
   {
       ScheduledExecutor se = new ScheduledExecutor();
       se.startAsync();
       Thread.sleep(15000);
       se.stopAsync();
   }

}

Wenn Sie über mehr solche Dienste verfügen, können Sie alle Dienste in ServiceManager registrieren, da alle Dienste gemeinsam gestartet und gestoppt werden können. Lesen Sie hier für weitere Informationen zum ServiceManager.

11
Aride Chettali

Wenn Sie bei Java.util.Timer bleiben möchten, können Sie es verwenden, um in großen Zeitabständen zu planen. Sie passieren einfach den Zeitraum, für den Sie suchen. Überprüfen Sie die Dokumentation hier .

7
Belizzle

Wenn Ihre Anwendung bereits Spring Framework verwendet, haben Sie Scheduling eingebaut 

3
Black

Mach jede Sekunde etwas

Timer timer = new Timer();
timer.schedule(new TimerTask() {
       @Override
       public void run() {
           //code
       }
    }, 0, 1000);
2
Duchic

Ich benutze die Funktion von Spring Framework. (spring-context jar oder Mavenabhängigkeit).

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


@Component
public class ScheduledTaskRunner {

    @Autowired
    @Qualifier("TempFilesCleanerExecution")
    private ScheduledTask tempDataCleanerExecution;

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
    public void performCleanTempData() {
        tempDataCleanerExecution.execute();
    }

}

ScheduledTaskist meine eigene Schnittstelle mit meiner benutzerdefinierten Methodeexecute, die ich als meine geplante Task aufrufe.

2
Yan Khonski

Haben Sie Spring Scheduler mit Anmerkungen versucht? 

@Scheduled(cron = "0 0 0/8 ? * * *")
public void scheduledMethodNoReturnValue(){
    //body can be another method call which returns some value.
}

sie können dies auch mit XML tun. 

 <task:scheduled-tasks>
   <task:scheduled ref = "reference" method = "methodName" cron = "<cron expression here> -or- ${<cron expression from property files>}"
 <task:scheduled-tasks>
1
madhu_karnati

Diese beiden Klassen können zusammenarbeiten, um eine periodische Aufgabe zu planen:

Geplante Aufgabe

import Java.util.TimerTask;
import Java.util.Date;

// Create a class extending TimerTask
public class ScheduledTask extends TimerTask {
    Date now; 
    public void run() {
        // Write code here that you want to execute periodically.
        now = new Date();                      // initialize date
        System.out.println("Time is :" + now); // Display current time
    }
}

Geplante Aufgabe ausführen

import Java.util.Timer;

public class SchedulerMain {
    public static void main(String args[]) throws InterruptedException {
        Timer time = new Timer();               // Instantiate Timer Object
        ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
        time.schedule(st, 0, 1000);             // Create task repeating every 1 sec
        //for demo only.
        for (int i = 0; i <= 5; i++) {
            System.out.println("Execution in Main Thread...." + i);
            Thread.sleep(2000);
            if (i == 5) {
                System.out.println("Application Terminates");
                System.exit(0);
            }
        }
    }
}

Referenz https://www.mkyong.com/Java/how-to-run-a-task-periodically-in-Java/

0
SumiSujith