我有許多Appointment
型號在一天的不同時間開始,或者在:00,:15,:30,:45。我想觸發代碼發送提醒1小時事件開始之前。使用後臺工作人員來觸發此事的最佳方式是什麼?我也使用clockwork寶石,所以我可以安排Sidekiq工作人員。在活動開始前一小時觸發的最佳方式
1
A
回答
2
clockwork
寶石用於固定計劃任務(替換爲cron)。你要使用ActionMailer.delay_until
附帶sidekiq
:
class Appointment
after_create :queue_reminder
def queue_reminder
MyMailer.delay_until(event_time - 1.hour).appointment_reminder(id)
end
end
見sidekiq
文檔瀏覽:https://github.com/mperham/sidekiq/wiki/Delayed-Extensions
正如shock_one提到的,如果你更新一個新的日期約會,你就必須重新排隊一提醒並取消舊的。如果Appointment
被銷燬,您還需要取消作業。
爲此,我建議您使用sidekiq-status
和reminder_job_id
列。您的Appointment
模型然後看起來像這樣:
class Appointment
before_save :queue_reminder, if: :event_time_changed?
after_destroy :cancel_reminder, if: :reminder_job_id?
def queue_reminder
cancel_reminder if reminder_job_id
self.reminder_job_id = MyMailer.delay_until(event_time - 1.hour)
.appointment_reminder(id)
end
def cancel_reminder
Sidekiq::Status.cancel reminder_job_id
end
end
0
首先你必須決定誰將負責安排。你可以有一個後臺進程,每十五分鐘運行一次,或者你可以讓模型在其生命的某個時刻安排事件 - 可能是在創建之後。
以前的解決方案更易於理解和維護,但後臺進程會有許多無用的空循環。
另一方面,後一種解決方案更精確。它將按需要執行多次。但是,如果模型更改,則可能會遇到困難:例如,創建後時間已被修改。您需要以某種方式取消上一個活動,然後安排一個新活動。
相關問題
- 1. 開始同樣活動並銷燬前一個活動的最佳方式
- 2. 最佳方式初始化活動ViewPager
- 3. 爲.net店開始移動/ IOS開發的最佳方式
- 4. 開始一個新的活動也會觸發onPause方法
- 5. 活動開始後,何時是ViewPager的setCurrentItem的最佳時間?
- 6. 開始使用Mac開發的最佳方式
- 7. 開始學習Android開發的最佳方式是什麼?
- 8. 開始開發大型網站的最佳方式是什麼?
- 9. 活動開始之前觸發的Android onActivityResult!
- 10. 通過context.startActivity(newActivity)觸發開始後取消活動的開始
- 11. 從點擊的列表視圖開始新活動的最佳方式
- 12. 開發羣聊室的最佳方式
- 13. 經過很長時間的Android開始活動最小化
- 14. 在另一個活動中使用變量的最佳方式
- 15. Android - 在活動上佈置一些文本的最佳方式
- 16. 開始新的活動時發生TransactionTooLargeException
- 17. 開始新活動的方式是最好的?
- 18. 在開始活動之前加載一個活動成員
- 19. 以觸摸方式打開活動android
- 20. 監控郵件收發郵件活動的最佳方式
- 21. 小工具開始活動
- 22. 觸發適時事件的最佳方式
- 23. model.fetch完成時觸發事件的最佳方式
- 24. Cocoa觸摸切換視圖時觸發方法的最佳方式
- 25. 開始在前臺的活動
- 26. 開發一組方法的最佳方式
- 27. 當新活動開始時不會暗淡以前的活動
- 28. EF代碼第一觸發器支持的最佳方式
- 29. 回發動態表的最佳方式
- 30. 開始由布爾在GameThread(機器人)觸發新的活動