2011-01-25 231 views
1

我有一個Web應用程序,我試圖在春季編程啓動Quartz調度程序。我有一個服務類,我創建一個SchedulerFactory的實例,然後得到一個調度器。與彈簧石英集成

代碼如下。

@Service("auctionWinnerService") 
public class NormalAuctionWinnerServiceImpl implements AuctionWinnerService { 

    public static final String NORMAL_AUCTION = "NORMAL AUCTION"; 
    public static int NORMAL_AUCTION_COUNTER = 0; 
    private SchedulerFactory schedulerFactory; 
    private Scheduler scheduler; 

    public void declareWinner(int auctionId, Map<String, Object> parameterMap) { 
     System.out.println("INSIDE declareWinner of NormalAuctionWinner"); 
     schedulerFactory = new StdSchedulerFactory(); 
     try { 
      scheduler = schedulerFactory.getScheduler(); 
      System.out.println("GOT SCHEDULER : "+scheduler); 
     } catch (SchedulerException e1) { 
      e1.printStackTrace(); 
     } 

     JobDetail jd = new JobDetail(); 
     jd.setName(NORMAL_AUCTION+" JOB "+NORMAL_AUCTION_COUNTER); 
     jd.setJobClass(NormalAuctionWinnerJob.class); 

     /** CREATE CRON TRIGGER INSTANCE **/ 
     CronTrigger t = new CronTrigger(); 
     t.setName(NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER); 
     t.setGroup("Normal Auction"); 
     Date d = new Date(); 
     Date d1 = new Date(); 
     d1.setMinutes(d.getMinutes()+5); 

     t.setStartTime(d); 
     t.setEndTime(d1); 
     try { 
      t.setCronExpression("10 * * * * ? *"); 
      scheduler.scheduleJob(jd, t); 
     } catch (SchedulerException e) { 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

schedulerFactory和scheduler被實例化,但我的作業不運行。 有人能指出我在這裏想念什麼嗎?

另外我只需要Factory和一個調度程序實例的一個實例。我試圖做出靜態,但它沒有奏效。任何在這個方向的指針都會有所幫助。

謝謝

+0

你真的需要石英,或者只是一個cron能力調度? – skaffman 2011-01-25 17:30:50

+0

我有拍賣的開始日期和結束日期。我的調度程序應該從開始日期開始,當拍賣到期時,觸發器應該會觸發。在我們的任務中,我們編寫了代碼來決定拍賣的勝利者。要求是,除非我創建拍賣,否則調度程序不應該啓動。只要我創建它並設置開始日期和結束日期,它應該從該特定日期開始。如果沒有創建拍賣,我們不希望調度程序運行。這可以實施嗎?還有一個規定是以編程方式啓動和停止它。 – cyclecount 2011-01-26 10:24:48

回答

0

首先,您如何知道Quartz或cron觸發器表達式?我可能會誤解,但10 * * * * ? *會使觸發器每隔10秒觸發一次,但我從未見過這樣的表達,它可能根本不會觸發。

您是否試圖創建一個觸發器每10秒觸發一次?在這種情況下,使用一個簡單的觸發器是這樣的:

new SimpleTrigger((NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER), 
        "Normal Auction", 
        d, 
        d1, 
        SimpleTrigger.REPEAT_INDEFINITELY, 
        10000L); 

編輯:

好了,如果這是你的要求,你需要一個觸發,填補火只有一次,在結束時間拍賣。爲此,使用SimpleTrigger這樣的:

new SimpleTrigger((NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER), 
       "Normal Auction", 
       d1, 
       null, 
       0, 
       0L); 

在這種情況下,開始日期並不重要,只要你將它設置爲火在適當的時間(結束時間),並只有一次。

作爲附加說明,不要計算這樣的日期。我建議你試試Joda Time library。對於笨拙的標準日期/日曆API來說,它非常簡單且廣爲人知。

1

除非您對Quartz的專有功能有特別的要求,否則我建議刪除它並使用Spring's internal scheduling capability。從Spring 3開始,這包括對cron類型表達式的支持,與Quartz的cron觸發器非常相似。

除了簡化您的應用程序和配置之外,它本質上比Quartz更可靠,並且通過TaskScheduler界面爲編程使用提供了更簡單的API。

0

您忘記了啓動調度程序! scheduler.start();

... 
try { 
    t.setCronExpression("10 * * * * ? *"); 
scheduler.scheduleJob(jd, t); 
scheduler.start(); 
} catch (SchedulerException e) { 
     e.printStackTrace(); 
} catch (ParseException e) { 
     e.printStackTrace(); 
} 

我已經證明了這一點,添加缺少的聲明,(和更換用假工作)後,它爲我工作/