【问题标题】:Necessity of cloning classes for background processes running through rake?通过 rake 运行的后台进程是否需要克隆类?
【发布时间】:2012-05-29 18:19:03
【问题描述】:

我有一个与ActionMailer 一起使用的resque 工人类,另一个与Mail 直接一起使用。这是一个简短的例子:

class NotificationWorker
  def self.perform(id)
    Mailer.delivery_method.settings = {
      # custom settings here
    }

    # Working with Mailer to deliver mails
  end
end

假设可能有两个工作人员在 NotificationWorker 上运行,我不确定它们是否会相互干扰。据我了解,直接处理 Mail 类会破坏功能,因为这会导致两个邮件程序使用相同的设置而不是分配的设置。一个解决方案是创建这样一个类的克隆(它适用于 ActionMailer,但不适用于 Mail AFAIK)。

根据 Resque 文档:

Resque 工作者是永远运行的 rake 任务。他们基本上做 这个:

start
loop do
  if job = reserve
    job.process
  else
    sleep 5 # Polling frequency = 5 
  end
end
shutdown

除了 Rails 应用程序的基本用法之外,我对 rake 并不熟悉。那么有谁能给我指点一下吗?

【问题讨论】:

    标签: rake actionmailer resque rake-task


    【解决方案1】:

    不太确定你想在这里实现什么。我有一个 resque 系统,可以排队并发送自动电子邮件。我是这样设置的:

    1) 环境.rb

    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {...}
    

    2) notification_job.rb # 它的工作不是需要创建的工人。

    class NotificationWorker
      def self.perform(id)
        # Working with Mailer to deliver mails
      end
    end
    

    如果您确实需要直接使用邮件程序并且每个工作人员需要不同的设置,那么您可能需要创建一个 yaml 文件,该文件与您在启动时为工作人员提供的变量相关。

    【讨论】:

    • 抱歉我的问题不清楚。我正在尝试根据用户提供的设置来获取和发送邮件。因此,每个Mail 或ActionMailer 实例都会在获取和发送之前获取自定义设置。由于设置不是存储在实例中而是存储在类本身上(例如MyMailer.delivery_method.smtp_settings=),我觉得当 resque 工作人员并行工作时它们会相互覆盖。
    • 啊,我有你。不,它应该没问题,就像你拥有它一样。每个“工作者”都是它自己的应用程序/版本。因此,只要您更改该进程的邮件设置,就完全没有问题。事实上,因为一名工作人员可以在发送之间尽可能多地更改它的设置,所以真的不应该有问题。可能出现问题的唯一方法是,如果您将设置设置为工作人员无法访问的地方。即后缀或其他东西。
    • 这就是我一直在寻找的。谢谢!
    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多