2014-11-14 80 views
3

我需要編寫一個調度程序類,應該每隔5,15和30分鐘調用一次。如何在Java中創建一個調度程序類

我應該如何開始使用此調度程序?我想用Java 7.

一種方法是知道當前時間,然後計劃每個計時器的差值。

有沒有已經做過類似工作的圖書館或班級?

+1

你知道[石英調度(http://quartz-scheduler.org/)或類似的應用程序? – 1ac0

+1

@Davide Pastore,op沒有要求固定延遲 – Shail016

+0

您可以創建具有不同延遲的不同調度程序並執行相同的可運行程序。 –

回答

1

石英2,這將是

Trigger trigger = TriggerBuilder 
    .newTrigger() 
    .withIdentity("someTriggerName", "someGroup") 
    .withSchedule(
     CronScheduleBuilder.cronSchedule("0 5,15,30 * * * ?")) 
    .build(); 

這將創建一個將激活觸發器小時過後的正確分鐘。第一場是秒;接下來是分鐘;然後小時;每月的某一天;月;星期幾(您希望未指定,因此爲?)。您可以爲每個條目指定多個條目,並且總是意味着;所以這是所有的日子,在過去5,10或15分鐘和0秒。

現在你可以創建一個Quartz工作

public class MyJob implements Job 
{ 
    public void execute(JobExecutionContext context throws JobExecutionException { 
     // do something useful 
    } 
} 

,並使用該觸發其排定:

Scheduler sched = new StdSchedulerFactory().getScheduler(); 
    sched.start(); 
    sched.scheduleJob(new MyJob(), trigger); 
+0

謝謝,可能會對cronSchedule參數產生一些影響。我在我的問題中忘記提到的是,我需要安排5分鐘,15分鐘,30分鐘等粒度的工作,所以5分鐘的工作應該在00:00,00:05,00:10運行。 15分鐘的工作應該在00:00,00:15運行。所以這種方式在00:00,00:30的粒度爲5,15,30的任務都會運行。在00:15,00:45 - 運行5分鐘和15分鐘粒度的任務。 – Bankelaal

+0

也想知道,當工作安排時,有一種方法可以知道它是否是第5分鐘或第15分鐘的工作......這是被觸發的。當然,我可以通過編程方式找到它,但是如果它可用於開箱即可。 – Bankelaal

+0

@Bankelaal啊,如果你希望他們按固定的時間間隔安排,每隔五分鐘和每十五分鐘一次,那麼你最好不要擔心Quartz! Quartz的意義在於你可以指定一個複雜的時間表,比如上面的時間表。 –

5

別重新發明輪子,使用現有的應用程序,使用Quartz scheduler或類似的應用程序。

0

b_erb

使用ScheduledExecutorService

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(yourRunnable, 0, 5, MINUTES); 

private final ScheduledExecutorService scheduler1 = Executors.newScheduledThreadPool(1); 
scheduler1.scheduleAtFixedRate(yourRunnable1, 0, 15, MINUTES); 

private final ScheduledExecutorService scheduler2 = Executors.newScheduledThreadPool(1); 
scheduler2.scheduleAtFixedRate(yourRunnable2, 0, 30, MINUTES); 
+1

可以用來每15分鐘計劃一次任務,但不是每小時的第15分鐘。 – Thilo

2

如果您正在使用Spring,您可以使用@Scheduled計劃任務。

點擊這裏獲取statred https://spring.io/guides/gs/scheduling-tasks/

如果簡單週期性調度表達不足,則可以提供cron expression。例如,以下內容僅在平日每15分鐘執行一次。

@Scheduled(cron="* */15 * * * MON-FRI") 
public void doSomething() { 
    // something that should execute on weekdays only 
} 

你需要注意*和cron expresssion的/你的情況

* :("all values") - used to select all values within a field. For example, "*" in the minute field means "every minute". 

/:- used to specify increments. For example, "0/15" in the seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". 
0

請參見下面的代碼調度:

public class SimpleScheduler 
{ 
    public static void main(String[] args) throws Exception 
    { 
     JobDetail job = new JobDetail(); 
     job.setName("hello"); 
     job.setJobClass(SchedulerJob .class); 

     //configure the scheduler time 
     SimpleTrigger trigger = new SimpleTrigger(); 
     trigger.setName("hello name"); 
     trigger.setStartTime(new Date(System.currentTimeMillis() + 1000)); 
     trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
     trigger.setRepeatInterval(30000); 

     //schedule it 
     Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
     scheduler.start(); 
     scheduler.scheduleJob(job, trigger); 

    } 
} 

接口名稱:

public class SchedulerJob implements Job 
{ 
    public void execute(JobExecutionContext context) 
    throws JobExecutionException { 

     System.out.println("u develop the code here"); 

    } 

} 
相關問題