假設我有一個包含帖子的博客應用程序。創建一個帖子後,創建一個工作者來處理一些後臺操作。我的情況是,在提交表單後,我想顯示某種加載消息(gif loader或類似),當工作完成時,我想隱藏加載消息並顯示一些由worker提供的數據。我的問題是什麼是溝通的最佳方式,即工作人員已完成工作並將其顯示在用戶的前端。工人回撥看起來像這樣後臺工作人員在rails應用程序中查看通信
def worker_finish
#message the user
end
假設我有一個包含帖子的博客應用程序。創建一個帖子後,創建一個工作者來處理一些後臺操作。我的情況是,在提交表單後,我想顯示某種加載消息(gif loader或類似),當工作完成時,我想隱藏加載消息並顯示一些由worker提供的數據。我的問題是什麼是溝通的最佳方式,即工作人員已完成工作並將其顯示在用戶的前端。工人回撥看起來像這樣後臺工作人員在rails應用程序中查看通信
def worker_finish
#message the user
end
我認爲你可能會錯過有背景的工作者,基本上,你試圖做的是自我挫敗。 - 如果用戶提交表單並將工作排在控制器中,則只有讓用戶等待工作人員開始和結束時,您不僅可以完全實現控制器本身可以完成的工作,而且可以使這個過程變得更加複雜(並且這種類型的功能不是內置在resque或sidekiq中的)。
當卸載工作由你想立即返回客戶端的響應隊列進行處理,即
class PostsController < ApplicationController
def create
@post = Post.create(params[:post])
BackgroundBlogOperation.enque(@post.id)
respond_with(@post)
end
end
然後BackgroundBlogOperation類將被放入隊列,一個工人要經過並努力工作。如果您在完成後需要使用BackgroundBlogOperation工作程序來完成其他操作,則可以這樣做,但這應該在作業本身內部進行,以便工作人員可以對此負責。
如果您只是在創建帖子後顯示並隱藏微調框,而無需重新加載頁面,只需在點擊提交按鈕之前顯示javascript微調框,並確保請求類型爲js(add:remote = >真正的形式)。然後創建一個看起來像JavaScript的觀點的迴應:
class PostsController < ApplicationController
respond_to :js, :only => [:create]
def create
@post = Post.create(params[:post])
BackgroundBlogOperation.enque(@post.id)
respond_with(@post)
end
end
而且create.js.erb,還可以追加一條消息,告訴他們,無論你是在後臺做的已排隊,如果它比創建更復雜一個職位或其他。
$("#spinner").hide();
現在 - 儘管你最初詢問doesent任何目的(因爲要顯示和隱藏的作業都需要等待控制器完成動作的完成微調) - 在有些情況下向客戶顯示該作業已經完成處理是有用的。
首先定義一個場景,其中後臺處理實際上是有用的。比方說,你有一個按鈕,點擊時,將從某個外部API獲取數據,並從外部站點獲取數據後,您將根據響應執行數據庫操作。這將是什麼時候使用後臺進程的一個很好的例子。基本上在控制器,你會做這樣的事情:
class ApiController < ApplicationController
respond_to :js, :only => [:create]
def sync_tweets
TwitterApiJob.enque(current_user.twitter_username)
respond_with(message: 'Syncing Tweets')
end
end
現在,告訴用戶在推特已經完成同步是更復雜一點,你有3個基本選項:
1)通知用戶通過電子郵件(通常是最差的選項imo) 2)使用某種類型的html5或websocket能力的rails服務器來運行rails,並通過websocket發送到客戶端,雖然非常酷,但在大多數情況下,在大多數情況下是過度殺傷和超出範圍的迴應。如果你想看看你的選擇,谷歌軌道websocket推動。 3)多數情況下IMO最好的選擇,創建notifcations模型來處理各種用戶的通知,並在你的工作,這項工作完成後,做這樣的事情
Notification.create(:user_id => user.id, :message => 'Sync has finished', type => 'sync_complete')
然後,在下一個頁面的用戶請求,在標題工具欄或任何地方,我會注意到用戶有未讀的通知,以提醒用戶點擊它。
---另外我覺得在你的帖子中提到你使用的是復古。我嘗試了resque並且體面,但是我發現它在生產中調試過於複雜,並且它使用了瘋狂的記憶 - 如果你還沒有使用,我建議你檢查一下sidekiq,它使用redis,但是它使用更快主題:
https://github.com/mperham/sidekiq
這是更快,更清潔,易得設置,恕我直言。
儘管所提供的用例可能並不理想,但該功能對於運行報告非常有用。 – aaandre