2014-06-06 39 views
1

我有许多Appointment型号在一天的不同时间开始,或者在:00,:15,:30,:45。我想触发代码发送提醒1小时事件开始之前。使用后台工作人员来触发此事的最佳方式是什么?我也使用clockwork宝石,所以我可以安排Sidekiq工作人员。在活动开始前一小时触发的最佳方式

回答

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-statusreminder_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

首先你必须决定谁将负责安排。你可以有一个后台进程,每十五分钟运行一次,或者你可以让模型在其生命的某个时刻安排事件 - 可能是在创建之后。

以前的解决方案更易于理解和维护,但后台进程会有许多无用的空循环。

另一方面,后一种解决方案更精确。它将按需要执行多次。但是,如果模型更改,则可能会遇到困难:例如,创建后时间已被修改。您需要以某种方式取消上一个活动,然后安排一个新活动。

相关问题