我在WebSphere 7上有一個Java EE應用程序。適合執行定時「cron作業」的Java EE技術是什麼?
我的應用程序將需要發送的電子郵件放在數據庫的通知表中。
我想寫一個觸發間隔爲5分鐘或10分鐘,並掃描與狀態條目通知表「待定」,發送電子郵件的代碼,然後更新狀態爲「已發送」。
什麼是適當的Java EE技術,使這種情況每5或10分鐘發生一次? Java EE中是否有一些「定時器進程」?
任何信息都是有用的,謝謝! 羅布
我在WebSphere 7上有一個Java EE應用程序。適合執行定時「cron作業」的Java EE技術是什麼?
我的應用程序將需要發送的電子郵件放在數據庫的通知表中。
我想寫一個觸發間隔爲5分鐘或10分鐘,並掃描與狀態條目通知表「待定」,發送電子郵件的代碼,然後更新狀態爲「已發送」。
什麼是適當的Java EE技術,使這種情況每5或10分鐘發生一次? Java EE中是否有一些「定時器進程」?
任何信息都是有用的,謝謝! 羅布
Quartz Scheduler是一個很好的圖書館。
Quartz非常出色,但是Java EE規範現在包含了可以滿足您需求的EJB計時器。
如果你什麼都不需要很花哨,你可以安排任務,java.util.concurrent.Executors
public class Foo implements Runnable(){
public void run(){
//do stuff
}
}
,並安排運行每噸毫秒d延遲秒
Executors.newScheduledThreadPool(10).scheduleAtFixedRate(new Foo(), d, t, TimeUnit.MILLISECONDS);
你可以將@Schedule註釋用於此目的。
的JavaEE 6有這個
http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html
@ManagedBean
@Stateless(name="MyScheduledTaskClass")
public class MyScheduledTaskClass implements Serializable{
private Logger _log = Logger.getLogger(this.getClass());
@Schedule(minute="*/5") //minute="*/10" if you want every 10 minutes
public void executeTask(){
_log.info("Scheduled task started");
//Do some stuff here
_log.info("Scheduled task finished");
}
}
的WebSphere 7定時服務運行的Java EE 5(我認爲),那麼你的選擇是在這方面有點受限。
您可以使用圖書館像Quartz Scheduler,但你必須要小心,把它掛到由容器管理的線程池。我相信默認情況下,它只是自己創建線程,這在EJB中是完全禁止的(並且在Web容器中非常不鼓勵)。
我找到了一個不錯的博客文章引導您完成設置在WebSphere工作管理池的配置:http://sanjsuya.wordpress.com/2012/01/19/asynchronousbean-was-spring-integration/
如果你使用Spring,你就可以勾了Quartz調度這個線程池相當容易使用WorkManagerTaskExecutor。這裏有一些關於這方面的Spring文檔(注意,它來自Spring 2,但我相信你或多或少會爲Spring 3做類似的事情):http://static.springsource.org/spring/docs/2.0.x/reference/scheduling.html
編輯:我的建築師略微(雖然也許你有這樣做的好方法)。你爲什麼要寫電子郵件給數據庫而不是隊列?這樣,它們就可以在接收系統的閒置時進行處理,並且不會將大量後臺工作重載到WebSphere上。
謝謝,你知道這是否可用於Java EE 5嗎? –
你使用哪個服務器版本/實現? – rkosegi
基於http://www.ibm.com/developerworks/websphere/library/techarticles/0707_barcia/0707_barcia.html和http://jcp.org/en/jsr/detail?id = 244你的服務器需要能夠使用JSR-236,這是JavaEE6規範的一部分。那麼爲什麼要使用JavaEE5呢? – rkosegi