Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails中使用rake任务对电子邮件发送进行排队?_Ruby On Rails_Ruby_Cron_Rake_Rails Activejob - Fatal编程技术网

Ruby on rails 如何在RubyonRails中使用rake任务对电子邮件发送进行排队?

Ruby on rails 如何在RubyonRails中使用rake任务对电子邮件发送进行排队?,ruby-on-rails,ruby,cron,rake,rails-activejob,Ruby On Rails,Ruby,Cron,Rake,Rails Activejob,我正试图通过使用where和rake任务来安排电子邮件发送 every 1.month, at: 'start of the month at 4am' do rake "reports:deliver_reports" end 在我的rake任务中,我使用一个类对所有电子邮件传递进行排队: # reports.rake namespace :reports do # rake reports:deliver_reports desc "Send reports to users"

我正试图通过使用where和rake任务来安排电子邮件发送

every 1.month, at: 'start of the month at 4am' do
  rake "reports:deliver_reports"
end
在我的rake任务中,我使用一个类对所有电子邮件传递进行排队

# reports.rake
namespace :reports do
  # rake reports:deliver_reports
  desc "Send reports to users"
  task deliver_reports: :environment do 
    QueueReportsService.call
  end
end
在该类中,我将每个电子邮件发送排队。

class QueueReportsService
  def self.call
    users = User.all
    users.each { |user| ReportMailer.report(user).deliver_later }
  end
end
根据之前发布的信息,我了解:

Rails本身只提供进程内排队系统,它只将作业保存在RAM

而且:

。。。使用Rake任务中的异步队列(…稍后使用.deliver_发送电子邮件)通常不起作用,因为Rake可能会结束,导致进程内线程池被删除

我知道使用
deliver
而不是
deliver\u later
将发送电子邮件

class QueueReportsService
  def self.call
    users = User.all
    users.each { |user| ReportMailer.report(user).deliver }
  end
end

但是,如果由于某种原因rake任务被中断,则不会发送后续的所有电子邮件。我希望通过为每个用户电子邮件安排一个单独的作业来防止这种情况发生,将在隔离状态下失败。

请记住,ActiveJob与其说是一个实现本身,不如说是一个标准接口。您可以使用一些具有不同功能的方法。@tadman我知道ActiveJob是一个接口,但是您共享的这些后端实现之一是否允许
deliver\u以后的
方法按预期工作,或者代码是否需要进一步修改?@AlvaroAlday如果您坚持sidekiq或resque(可能还有其他方法),它将按预期工作。它与active record数据库适配器类似,因为您的代码不需要修改就可以跨Rails通过适配器支持的技术工作。@MarkMerritt我进入了我们的代码库,了解到我们目前正在使用延迟作业作为后端。那么,为什么延迟的_作业不处理rake任务生成的队列呢?DelayedJob是否需要进一步配置?请记住,ActiveJob本身更像是一个标准接口,而不是一个实现。您可以使用一些具有不同功能的方法。@tadman我知道ActiveJob是一个接口,但是您共享的这些后端实现之一是否允许
deliver\u以后的
方法按预期工作,或者代码是否需要进一步修改?@AlvaroAlday如果您坚持sidekiq或resque(可能还有其他方法),它将按预期工作。它与active record数据库适配器类似,因为您的代码不需要修改就可以跨Rails通过适配器支持的技术工作。@MarkMerritt我进入了我们的代码库,了解到我们目前正在使用延迟作业作为后端。那么,为什么延迟的_作业不处理rake任务生成的队列呢?DelayedJob是否需要进一步配置?