2010-06-09 87 views
2

我需要在調用EJB方法後異步執行一些東西。這種需求似乎是在EJB 3.1中實現的,但不幸的是,我們還沒有實現,只能使用3.0版本。EJB和異步處理

作爲最簡單的方法,您會有什麼建議,並且有注意事項?我能想到以下方法:

  • JMS(可能矯枉過正)
  • TimerService(看起來很簡單)
  • 春天的TaskExecutor(這是如何配置的)

這需要工作,一個Weblogic服務器。不會有任何巨大的負載或大規模並行處理,我只是希望它很好,很簡單。

回答

2

您必須先決定是否要異步事務處理。也就是說,如果常規EJB方法事務失敗,異步事件是否仍然被觸發。

JMS和TimerService是事務性的。春天TaskExecutor,可能不是(我應該仔細檢查一下)。

使用Timer您可以延遲事件的執行(即使爲0),以便在EJB方法返回後,異步事件立即在後臺運行。如果異步事件失敗,計時器服務會嘗試重新運行幾次。

使用JMS,您無法嚴格控制何時處理該事件。一旦消息被髮送,你就知道它會最終被處理,但是代理理論上可以推遲它的處理來管理負載。

我不知道您的具體使用情況,但使用TimerService似乎非常適合,如果負載不是問題,再加上它很容易使用。

+0

TimerService似乎是最簡單的,但是從我讀的內容來看,它並沒有對準確性給出太多的保證,我希望儘可能立即啓動該過程。 – yedd 2010-06-10 06:01:31

+0

@yedd根據我在Glassfish中的經驗,您可以爲過期定時器的輪詢和重新發送間隔配置幾個值http://docs.sun.com/app/docs/doc/820-7695/beahw?l=en&n = 1&一個=圖。我們用1秒的精度對它進行了配置,並且這個工作正常。我猜在weblogic中有類似的東西。您可以嘗試縮短間隔時間,以使其對您而言變得足夠「直接」。 – ewernli 2010-06-10 08:00:29

2

WorkManager專爲此目的而設計,並由WebSphere和WebLogic本地支持。其他應用程序服務器也有其他實現。

它被設計用來執行異步工作,同時仍然允許服務器管理線程。

+0

可以試試看,Spring似乎還有一個TaskExecutor實現。我現在不介意可移植性。 – yedd 2010-06-10 06:06:19