it-swarm-id.com

Bagaimana cara menjadwalkan tugas berkala di Jawa?

Saya perlu menjadwalkan tugas untuk dijalankan pada interval waktu yang tetap. Bagaimana saya bisa melakukan ini dengan dukungan interval yang panjang (misalnya pada setiap 8 jam)?

Saat ini saya menggunakan Java.util.Timer.scheduleAtFixedRate. Apakah Java.util.Timer.scheduleAtFixedRate mendukung interval waktu yang lama? 

149
RYN

Gunakan ScheduledExecutorService :

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

Anda harus melihat ke Kuarsa itu adalah kerangka Java yang bekerja dengan edisi EE dan SE dan memungkinkan untuk mendefinisikan pekerjaan untuk mengeksekusi waktu tertentu

41
Jorge

Coba dengan cara ini ->

Pertama-tama buat TimeTask kelas yang menjalankan tugas Anda, sepertinya:

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

lalu di kelas utama Anda membuat instance tugas dan menjalankannya secara berkala dimulai dengan tanggal yang ditentukan:

 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

Gunakan Google Guava AbstractScheduledService seperti yang diberikan di bawah ini:

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

}

Jika Anda memiliki lebih banyak layanan seperti ini, maka mendaftarkan semua layanan di ServiceManager akan baik karena semua layanan dapat dimulai dan dihentikan bersama. Baca di sini untuk informasi lebih lanjut tentang ServiceManager.

11
Aride Chettali

Jika Anda ingin tetap menggunakan Java.util.Timer, Anda dapat menggunakannya untuk menjadwalkan pada interval waktu yang besar. Anda cukup melewati periode yang Anda inginkan. Periksa dokumentasinya di sini .

7
Belizzle

Jika aplikasi Anda sudah menggunakan kerangka kerja Spring, Anda memiliki Penjadwalan bawaan 

3
Black

Lakukan sesuatu setiap satu detik

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

Saya menggunakan fitur Spring Framework. (konteks semi ketergantungan jar atau 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();
    }

}

ScheduledTaskadalah antarmuka saya sendiri dengan metode khusus sayaexecute, yang saya sebut sebagai tugas terjadwal saya.

2
Yan Khonski

Sudahkah Anda mencoba Penjadwal Musim Semi menggunakan anotasi? 

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

anda dapat melakukannya dengan xml juga. 

 <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

Dua kelas ini dapat bekerja bersama untuk menjadwalkan tugas berkala:

Tugas Terjadwal

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

Jalankan Tugas Terjadwal

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

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

0
SumiSujith