Hoe een periodieke taak in Java plannen?

Ik moet een taak plannen die met een vast tijdsinterval wordt uitgevoerd. Hoe kan ik dit doen met ondersteuning van lange intervallen (bijvoorbeeld om de 8 uur)?

Ik gebruik momenteel java.util.Timer.scheduleAtFixedRate. Ondersteunt java.util.Timer.scheduleAtFixedRatelange tijdsintervallen?


Antwoord 1, autoriteit 100%

Gebruik een ScheduledExecutorService:

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

Antwoord 2, autoriteit 17%

Je zou eens moeten kijken naar Quartzhet is een Java-framework dat werkt met EE- en SE-edities en waarmee je taken kunt definiëren om een specifieke tijd uitvoeren


Antwoord 3, autoriteit 8%

Probeer het op deze manier ->

Maak eerst een klas TimeTask die uw taak uitvoert, het ziet er als volgt uit:

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

dan start je in de hoofdklasse de taak en voer je deze periodiek uit, gestart op een bepaalde datum:

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

Antwoord 4, Autoriteit 5%

Gebruik Google Guava AbstractScheduledServicezoals hieronder vermeld:

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

Als u meer diensten zoals deze hebt, zal u alle services in Servicemanager registreren goed, want alle services kunnen worden gestart en bij elkaar gestopt. Lezen Hier voor meer op servicemanager.


Antwoord 5, Autoriteit 3%

Als je java.util.Timerwilt gebruiken, kun je het gebruiken om met grote tijdsintervallen te plannen. Je passeert gewoon in de periode waarvoor je fotografeert. Bekijk de documentatie hier.


Antwoord 6, autoriteit 2%

Als uw toepassing al gebruikmaakt van Spring Framework, heeft u Planningingebouwd


Antwoord 7, autoriteit 2%

Ik gebruik de functie van Spring Framework. (spring-contextjar of maven-afhankelijkheid).

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

ScheduledTaskis mijn eigen interface met mijn aangepaste methode execute, die ik noem als mijn geplande taak.


Antwoord 8, autoriteit 2%

Deze twee klassen kunnen samenwerken om een periodieke taak te plannen:

Geplande taak

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

Geplande taak uitvoeren

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

Referentie https://www. mkyong.com/java/hoe-een-taak-periodiek-in-java-uit te voeren/


Antwoord 9, autoriteit 2%

Doe elke seconde iets

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

Antwoord 10

Heb je Spring Schedulergeprobeerd met annotaties?

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

U kunt dit ook met XML doen.

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

Antwoord 11

Mijn Servlet bevat dit als een code Hoe dit in de planner behouden als een gebruiker wordt geaccepteerd

if(bt.equals("accept")) {
    ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
    String lat=request.getParameter("latlocation");
    String lng=request.getParameter("lnglocation");
    requestingclass.updatelocation(lat,lng);
}

Antwoord 12

Er is een ScheduledFutureKlasse in Java.Util.Concurrent, het kan u helpen.

Other episodes