包装Sidekiq执行添加时区感知的方法

时间:2014-05-30 19:34:12

标签: ruby-on-rails ruby sidekiq

我有一个带有动态配置时区的rails应用程序。它存储在包含其他选项的数据库表中,rails应用程序本身配置为UTC(默认)。

我已使用around使用简单的Time.use_zone(..., &block)过滤器让应用程序自己了解时区。

我想为我的Sidekiq工作人员做类似的事情。其中一些处理具有时区相关性的数据,因此他们需要它。我没有看到Sidekiq本身可用的任何过滤选项,没有回调,在我可以挂钩的类型之前/之后。我目前的解决方案是prepend模块,如下所示:

module TimeZoneAwareWorker

  def perform(*args)
    Time.use_zone(Options.time_zone) do
      super
    end
  end

end

并混入:

class MyWorker

  include Sidekiq::Worker

  prepend TimeZoneAwareWorker

  ...

end

这适用于简单的工作人员,但如果prependinclude Sidekiq::Worker在同一个类中,则会发生故障。如果工作者是子类,则层次结构不会为前置perform包含实现。

有更好的方法吗? 最终,我真正想要的是一种用另一种方法包装单个方法并产生包装实现的万无一失的方法。

我知道我的另一个选择是在Sidekiq的实现类型回调之前/之后/周围进行monkeypatching,但是如果被迫,我只想去那里。

1 个答案:

答案 0 :(得分:4)

Sidekiq有自己的middleware解决方案:

  

Sidekiq对Rack的中间件有类似的概念:这些很小   可以实现功能的代码。 Sidekiq休息   中间件进入客户端和服务器端。

     
      
  • 客户端中间件在将作业推送到Redis之前运行,并允许您在推送作业之前修改/停止作业。客户   中间件可能会将类参数作为Class对象或a接收   包含类名称的字符串。
  •   
  • 服务器端中间件运行'工作处理。 Sidekiq的重试功能是作为一个简单的中间件实现的。
  •   

您可以轻松创建自己的中间件代理,以添加时区感知代码。