2013-07-18 58 views
1
JobDetail job = new JobDetail(); 
job.setName("dummyJ"); 
job.setJobClass(NotificationCreater.class); 

SimpleTrigger trigger = new SimpleTrigger(); 
trigger.setName("mn"); 
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000)); 
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
trigger.setRepeatInterval(30000); 

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

我用上面的代碼來安排我在NotificationCreater.class活動,但我得到錯誤信息作業調度不調用

錯誤:-Unable到作業存儲與名稱:「dummyJ」和組:「DEFAULT ',因爲一個已經存在這個識別。

+0

您的錯誤字符串爲您提供確切的原因 - 組中有另一個具有相同名稱的計劃作業。 – Richie

+0

@裏奇我只有一個預定的工作 – nakul

+0

然後嘗試通過更改作業名稱。 –

回答

0

如果使用servlet,並且想在應用程序啓動時運行你的工作,我想這就是你應該如何着手實現的。

作業類

public class DummyJob{ 

public DummyJob() throws ParseException, SchedulerException { 

JobDetail job = new JobDetail(); 
job.setName("dummyJ"); 
job.setJobClass(NotificationCreater.class); 

SimpleTrigger trigger = new SimpleTrigger(); 
trigger.setName("mn"); 
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000)); 
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
trigger.setRepeatInterval(30000); 

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.start(); 
scheduler.scheduleJob(job, trigger); 
} 
} 

該servlet

public class JobInitializerServlet extends HttpServlet { 

/** 
* 
*/ 
private static final long serialVersionUID = 5102955939315248840L; 

/** 
* Application logger to log info, debug, error messages. 
*/ 
private static final Logger APP_LOGGER = Logger.getLogger("appLogger"); 

/** 
* @see Servlet#init(ServletConfig) Initializes DummyJob 
*/ 
public void init(ServletConfig config) throws ServletException { 

    try { 
     DummyJob scheduler = new DummyJob(); 
    } catch (java.text.ParseException e) { 
     APP_LOGGER.error(e.getLocalizedMessage(), e); 
    } catch (SchedulerException e) { 
     APP_LOGGER.error(e.getLocalizedMessage(), e); 
    } 

} 

}

和servlet映射

<servlet> 
    <description> 
    </description> 
    <display-name>JobInitializerServlet</display-name> 
    <servlet-name>JobInitializerServlet</servlet-name> 
    <servlet-class>com.job.servlet.JobInitializerServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

這將會盡快部署或開始啓動工作你的應用離子。希望這可以幫助。

1

您可以使用Servlet中的init方法來初始化和啓動計劃。在移除應用程序後,您還應該使用Servlet中的destroy方法從池中移除計劃作業,以避免在重新部署期間發生相同的錯誤。你可以像scheduler.unscheduleJob()scheduler.shutdown()這樣刪除作業並停止調度程序銷燬方法。

0

trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);

該觸發器正在設置爲不確定重複計數。 意思是,觸發器將永遠存在數據庫中。 因此,與觸發器關聯的作業將永遠存在於數據庫 中。

所以,你第一次執行你的程序,很高興看到它運行。 你停止執行並休息一下。 然後你回來,想要顯示給你的經理和@#$%@#BOOM#$%#$%#$ 5。

您試圖創建作業並使用已在 數據庫中的名稱進行觸發。而調度程序將會導致你無法做到這一點。

解決方案:

  1. 消滅從石英數據庫表中的所有數據,你開始 程序的下一個執行之前。或
  2. 請勿使用無限期的觸發器。使用一個簡單的。一次執行或兩到三次而不是〜。 OR
  3. 使用RAMJobStore。