2012-03-19 47 views
3

我有兩個工作,認爲他們是超級簡單的工作,只是打印一行,沒有觸發器或超時定義。當我通過控制器類呼叫他們時,他們工作得很好:<name of my class>Job.triggerNow()如何在另一個完成時觸發作業?

我想要的是觸發一項工作,並隨着工作完成而觸發一項隨之而來的不同工作。

我嘗試過使用quartzScheduler,但我似乎無法從我的工作類中獲得JobDetail,所以我不確定這樣做的正確方法是什麼。我也想把第一份工作的一些結果傳遞給第二份工作。

我知道我可以觸發第二個作業的最後一行對我的第一份工作的執行方法,但是這是不可取的,因爲它在技術上並不比我想的第一份工作和夫妻的事情的一部分。

任何幫助將不勝感激。感謝

+0

對不起忘了提及這是在grails中使用石英(所以即時通訊使用groovy而不是java) – 2012-03-19 19:28:29

回答

2

它聽起來像什麼,你追求的是工作的一個異步「管道」裏也有不同的工人說都是在一條線上,並通過將數據從一個工作到下一個。這種架構是驚人靈活,適用於一些非常普遍的應用

,我發現得到的地方這樣的架構,Grails的,最好的辦法是使用消息隊列,像RabbitMQ例如,通過一系列隊列(管道中的每一步都有一個隊列),然後讓控制器將消息放入管道的第一步。

然後,如果您有一名工作人員(如果您使用優秀的RabbitMQ Grails plugin,那麼只需在Grails應用程序中提供一項服務)就可以監聽保存作業的隊列。隨着工作進入隊列,工作人員將關閉作業,處理作業,然後將消息放入管道中下一步的隊列中。

我發現這是建築師幾乎任何異步流水線的最好方式,因爲它允許根據需要您單獨縮放每個片,沒有太多的開銷。有方式也從不必瞭解在管道中的下一個步驟的分離工作,但我發現,在大多數情況下,這是不是真的需要,只是徒然增加了複雜性。

石英非常適合那些需要按計劃發生的工作,但管道是在處理事情變得更好,因爲它有一個可擴展的方式

+0

感謝您的建議。爲了澄清,我是否仍然可以在後臺使用石英作業並通過服務或控制器通過RabbitMQ連接它們,還是應該將我的「作業」移動到常規的java/groovy類或服務中,然後從那裏進行操作? – 2012-03-19 22:32:47

+0

對於需要在日程安排_上發生的任何任務,請使用我們的石英工作。對於任何應該更像是讓工作人員觀察一系列作業並在它們進入時處理它們的任務,使用RabbitMQ插件在執行工作的隊列上創建監聽器(這只是一個grails服務)。不同之處在於石英工作是週期性的,RabbitMQ工作儘可能快地處理工作。 – cdeszaq 2012-03-20 12:31:05

0

請看看@ JobListener

你可以利用

public void jobWasExecuted(JobExecutionContext context, 
      JobExecutionException jobException); 
0

我在我的Web應用程序中使用Redis的隊列消息傳遞技術構建了類似於此的東西。我只是爲所有作業定義依賴關係結構,並擁有一個主作業,唯一的目的是監視/更新其他作業的狀態,並在需要時觸發依賴作業。

每個作業必須報告其狀態的運行/結束/使用Redis的隊列取消。主作業彈出每個隊列消息並正確處理。

相關問題