web-dev-qa-db-fra.com

Comment planifier une tâche périodique en Java?

Je dois planifier l'exécution d'une tâche à un intervalle de temps fixe. Comment puis-je faire cela avec une prise en charge d'intervalles longs (par exemple toutes les 8 heures)?

J'utilise actuellement Java.util.Timer.scheduleAtFixedRate. Est-ce que Java.util.Timer.scheduleAtFixedRate supporte des intervalles de temps longs? 

149
RYN

Utilisez un ScheduledExecutorService :

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

Vous devriez jeter un coup d'œil à Quartz c'est un framework Java qui fonctionne avec les éditions EE et SE et permet de définir des tâches pour l'exécution d'une heure spécifique

41
Jorge

Essayez de cette façon ->

Tout d’abord, créez une classe TimeTask qui exécute votre tâche. Elle se présente comme suit:

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());
       }
    }
}

ensuite, dans la classe principale, vous instanciez la tâche et l'exécutez périodiquement à partir d'une date spécifiée:

 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

Utilisez Google Guava AbstractScheduledService comme indiqué ci-dessous:

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();
   }

}

Si vous avez plus de services comme celui-ci, il sera bon d’enregistrer tous les services dans ServiceManager, car ils peuvent tous être démarrés et arrêtés ensemble. Lisez ici pour plus d'informations sur ServiceManager.

11
Aride Chettali

Si vous voulez vous en tenir à Java.util.Timer, vous pouvez l’utiliser pour programmer à des intervalles de temps longs Vous passez simplement dans la période pour laquelle vous tirez. Consultez la documentation ici .

7
Belizzle

Si votre application utilise déjà le framework Spring, vous avez Planification intégré 

3
Black

Faire quelque chose toutes les secondes

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

J'utilise la fonctionnalité de Spring Framework. (spring-context jar ou dépendance maven).

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();
    }

}

ScheduledTaskest ma propre interface avec ma méthode personnaliséeexecute, que j'appelle comme tâche planifiée.

2
Yan Khonski

Avez-vous essayé Spring Scheduler en utilisant des annotations? 

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

vous pouvez aussi le faire avec XML. 

 <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

Ces deux classes peuvent travailler ensemble pour planifier une tâche périodique:

Tâche planifiée

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
    }
}

Exécuter la tâche planifiée

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);
            }
        }
    }
}

Référence https://www.mkyong.com/Java/how-to-run-a-task-periodically-in-Java/

0
SumiSujith