2012-03-01 24 views
3

我需要處理上傳的文件,它可能只需要1秒或10分鐘。目前我的解決方案是用30秒的定時器做一個石英工作,然後在任何時候處理和任意工作。這有幾個問題。Grails非基於時間的排隊

其中之一:如果作業將花費少於幾秒鐘的時間,則對於作業隊列等待30秒是浪費的。

二:如果在隊列中只有一個長工作,它可能會嘗試做兩次。

我想要的是一個永恆的隊列。當添加事物時,如果有空閒的工作人員,則立即開始。有沒有解決方案?我正在看耶穌,但我不知道它是否可以做到這一點。

+0

傑西克絕對可以做到這一點。這是消息隊列背後的基本思想(與Quartz這樣的作業調度器相反,它實際上不是隊列) – cdeszaq 2012-03-01 22:44:48

回答

2

你正在尋找的是一個基本的消息隊列。有很多選項,但我最喜歡的Grails是RabbitMQ。 Grails插件相當不錯,根據我的經驗表現良好。

通常情況下,消息隊列允許您有N個生產者(創建作業的東西)將工作消息添加到隊列中,然後M個消費者將作業從隊列中抽出並處理它們,當工作人員完成作業時,要求隊列處理下一個工作,如果沒有,它只是等待隊列給它做些什麼,隊列還會跟蹤消息處理的成功/失敗(你可以控制這個),以便你不要這樣做的好處是不依賴於輪詢(所以你可以在事情進入時立即開始處理),並且它也是可擴展的。你可以擴展你的規模生產者和消費者根據需要上調或下調,將投入與產出脫鉤以便您可以採取流量峯值,然後在您擁有可用資源(工作人員)的情況下通過它進行工作。

-1

要解決問題,只需要每5秒(或3秒或1秒)檢查新上傳的文件。如果檢查上傳的文件很快,那麼沒有理由不能經常運行它。

對於問題二,您只需要記錄何時開始處理文件以確保它不會被拾取兩次。您可以在數據庫中創建一個表格,或將信息存儲在某處。

+0

輪詢不能很好地擴展,向循環中添加數據庫只會產生額外的資源爭用。特別是隨着應用程序向更實時的處理方向發展,輪詢速度很快就會崩潰。 – cdeszaq 2012-03-01 22:42:58

+0

我的問題是,我必須對第二個標誌執行各種檢查來解決處理掛起的情況。 – Mikey 2012-03-01 23:20:17

+0

@Mikey - 不用擔心。但是,除非我錯過了某些東西,否則即使您使用隊列來安排它們,仍需要代碼來處理掛起的作業。 – David 2012-03-02 01:13:19