Bagaimana cara menjadwalkan tugas berkala di Jawa?

183

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

Saya sedang menggunakan java.util.Timer.scheduleAtFixedRate. Apakah java.util.Timer.scheduleAtFixedRatemendukung interval waktu yang lama?

RYN
sumber

Jawaban:

261

Gunakan Layanan ScheduledExecutorService :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
b_erb
sumber
1
Jika Anda ingin ini berjalan setiap hari pada waktu tertentu tidak ada cara yang bagus untuk melakukannya, karena TimeUnitberlaku untuk kedua initialDelaydan period. Berjalan setiap 24 jam akan berakhir menjadi terlempar ketika tendangan DST di, tetapi TimeUnitdari DAYStidak membiarkan Anda menentukan berbutir halus initialDelay. (Saya pikir implementasi ScheduledExecutorService internal mengkonversi DAYSke nanoseconds pula).
Sam Barnum
46

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

Jorge
sumber
23

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

kemudian di kelas utama Anda instantiate 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));
}
Shessuky
sumber
6
Untuk membuat kode lebih mudah dibaca, Anda dapat mengubah argumen terakhir saat Anda menjadwalkan panggilan ke TimeUnit.HOURS.toMillis (8)
darrenmc
Dokumentasi untuk Timer merekomendasikan untuk menggunakan kerangka kerja Pelaksana.
Karan Khanna
14

Gunakan Google Guava AbstractScheduledServiceseperti 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 lebih lanjut tentang ServiceManager.

Aride Chettali
sumber
9

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

Percaya
sumber
5

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/

SumiSujith
sumber
Solusi terbaik sampai sekarang, lebih bersih dan mudah diimplementasikan
Salvador Vigo
4

Jika aplikasi Anda sudah menggunakan Spring framework, Anda telah menjadwalkan dibangun di

Hitam
sumber
4

Lakukan sesuatu setiap satu detik

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //code
    }
}, 0, 1000);
Kadipaten
sumber
1
Dokumentasi untuk Timer merekomendasikan menggunakan kerangka kerja Pelaksana
Karan Khanna
3

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

}

ScheduledTask adalah antarmuka saya sendiri dengan eksekusi metode kustom saya, yang saya sebut sebagai tugas terjadwal saya.

Yan Khonski
sumber
2

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>
madhu_karnati
sumber
0

servlet saya mengandung ini sebagai kode bagaimana menjaga ini dalam scheduler jika pengguna menekan menerima

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