2016-07-11 51 views
2

是否:異步隊列適配器實際上做了什麼?Rails異步活動作業不執行代碼,而行內卻

:inline,這是Rails 4中的默認值,在當前執行線程中處理使用ActiveJob構建的作業,呃... inline。異步,不應該。它應該使用ConnectionPool在當前線程中不運行它,理想情況下會發生什麼。它會在當前執行線程之外運行。

但沒有執行它。

我對這篇文檔感興趣,唯一可以理解的是:異步,不像inline,不執行任務,並期望您在本地執行周圍構建系統。我必須在所有作業上手動執行perform以使它們在本地執行。當我將適配器設置爲:inline時,它無需執行就可以正常工作。

是否有一些配置問題我錯過了防​​止異步正常工作(如ActionCable?)。

如果從rake任務(或控制檯?)執行它,它不起作用嗎?

它可以很好地與:sidekiq /:resque,但我不想在這些地方一直運行。

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

這是一種什麼提示我在那裏被一些錯誤的。我的工作是坐在排隊的地方,只是不運行。有什麼可以阻止呢?

回答

4

這就是我發現的。隨着併發ruby的出現,rake任務不會被設置來處理這個問題。

如果您在文檔中閱讀過,它說的是:async,那麼在過程結束時將其清除。

Rails本身只提供一個進程內排隊系統,只有 保留RAM中的作業。如果進程崩潰或機器重置,則 ,則所有未完成的作業都會在默認異步後端丟失。

Rake進程在結束時結束。因此,如果您正在進行任何類型的數據更改,則rake任務的運行時間不足以運行作業,這就是爲什麼他們運行:inline就好,但不是:async

所以,我還沒有想出一個解決方案來保持rake任務的運行時間足夠長,以運行:async(並且始終保持應用:async)。我必須將其切換到:inline才能運行任務,然後在完成剩餘的工作後返回:async。這就是爲什麼它可以與:sidekiq:resque一起工作,因爲這些應用程序將作業信息保存在內存中,並且在耙機任務結束時不會釋放。

爲了耙任務與:async本地工作,有沒有什麼可以比運行的任務做其他的:inline如果你是本地直到耙(作爲任務運行)懂得如何保持開放而異步任務已經推出(或不)。作爲一個僅限於開發的功能,這並不是高優先級,但是,如果你在桌面上b your不理,爲什麼:async默認運行作業的任務不能真正運行,這就是爲什麼。

+0

@januszm很高興我可以給你一點幫助。 – tadiou