【问题标题】:How do I programmatically find out the schedule of a delayed mailer job with Resque Mailer and Resque scheduler?如何使用 Resque Mailer 和 Resque scheduler 以编程方式找出延迟邮件作业的时间表?
【发布时间】:2017-11-18 09:35:13
【问题描述】:

我正在尝试使用以下任何或所有参数作为输入来显示下次安排电子邮件的时间。我正在使用 resque、resque-scheduler 和 resque-mailer。

例如,上面是 resque web 界面中显示的延迟作业。所以我想输入“game_starting_reminder”和/或 226 和/或“Beat Box”,然后能够显示时间戳:

“下一个预定的电子邮件:2017 年 10 月 31 日晚上 9:30”。

但是,当我尝试在控制台中调用信息时,以下是我收到的输出

我尝试过扩展 delay_extensions 和方法并使用 find_delayed_selection 方法,但这似乎不起作用。 例如:

    [18] pry(main)> Resque.find_delayed_selection { |job| job["class"] == QuizMailer}
TypeError: no implicit conversion of String into Integer

或者这个:

[32] pry(main)> Resque.find_delayed_selection { { 
[32] pry(main)*     "class": "QuizMailer",            
[32] pry(main)*     "args": ["game_starting_reminder", [226, "Beat Box"]],            
[32] pry(main)*     "queue": "mailer"            
[32] pry(main)* }}            
=> ["{\"class\":\"QuizMailer\",\"args\":[\"game_starting_reminder\",[226,\"Beat Box\"]],\"queue\":\"mailer\"}",
 "{\"class\":\"QuizMailer\",\"args\":[\"game_ending_reminder\",[226,\"Beat Box\"]],\"queue\":\"mailer\"}"]

我可以在这里使用任何其他方法吗?或提示。 谢谢!

【问题讨论】:

    标签: ruby-on-rails resque resque-scheduler


    【解决方案1】:

    想通了。 schedule_at 方法是该工作的最佳候选者。

    第一步是将DelayingExtensions 模块添加到项目中。我刚刚将 Github 上 resque source code 中的文件添加到初始化程序,然后在 resque.rb 中添加了以下行:

     #resque.rb
    rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
    rails_env = ENV['RAILS_ENV'] || 'development'
    
    resque_config = YAML.load_file(rails_root + '/config/resque.yml')
    Resque.redis = resque_config[rails_env]
    include DelayingExtensions
    

    我稍微修改了 github 源代码中的 schedule_at 方法,因为我无法让它按原样工作,并将方法的名称更改为 schedule_for_time

       #delaying_extensions.rb
       def scheduled_for_time(klass, *args)
        args = args[0]
        search = encode(job_to_hash(klass, args))
        redis.smembers("timestamps:#{search}").map do |key|
          key.tr('delayed:', '').to_i
        end
       end
    

    在这种情况下,我们可以在控制台中执行以下操作:

        [2] pry(main)> klass =QuizMailer
        => QuizMailer
        [4] pry(main)> args = ["game_starting_reminder", [230, "Beat Box"]]
        => ["game_starting_reminder", [230, "Beat Box"]]
        [5] pry(main)> Resque.scheduled_for_time(QuizMailer, args)
        => [1515081600]
        [6] pry(main)> Time.at(_.first)
         => 2018-01-04 21:30:00 +0530
    

    瞧!

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 2013-12-05
      • 1970-01-01
      • 2015-09-17
      • 2011-01-25
      • 2017-09-27
      • 1970-01-01
      • 2012-11-28
      • 2012-11-07
      相关资源
      最近更新 更多