我有许多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(机器人)触发新的活动