【问题标题】:Time.zone works on API but not on workersTime.zone 适用于 API 但不适用于工作人员
【发布时间】:2019-08-26 20:38:29
【问题描述】:

我正在使用 Grape 框架构建一个 API,我想将整个应用程序的默认时区设置为 UTC,这样当我调用 Time.zone.now 时,我就能得到正确的时间

我的config/application.rb 看起来像:

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'api'))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'app'))
$LOAD_PATH.unshift(File.dirname(__FILE__))

require 'bundler/setup'

Bundler.require :default, ENV['RACK_ENV']

Time.zone = 'UTC'

require_rel '../app'
require_rel '../api'
require_rel '../lib'
require_rel 'initializers'

如果我通过bundle exec rackup -p 3000bin/console 启动它并调用Time.zone.now 我得到了正确的时间:Fri, 05 Apr 2019 00:47:23 UTC +00:00

虽然,当我使用 Sidekiq 工作人员或 Rack 本身之外的其他东西 (bundle exec sidekiq -r ./config/application.rb) 并尝试调用 p Time.zone 时,nil 被返回,Time.current 以我的时区返回时间:2019-04-04 21:48:57 -0300 ,即使我要求 application.rb 包含 Time.zone = 'UTC' 声明

我如何也为我的员工设置全球 UTC 时区?

编辑 #1 - 工人代码

这是一个简单的 worker:它只打印 Time.nowTime.zone.now

module Cron
  class Date
    include Sidekiq::Worker
    JOB_NAME = 'date_job'

    def perform(start_date = 1.day.ago, end_date = Time.current)
      p [Time.now, Time.current]
    end
  end
end

【问题讨论】:

  • 您能否提供有关工人工作的模式详细信息/代码?
  • @dharmesh 完成...

标签: ruby timezone grape grape-api


【解决方案1】:

您可以只引入一个ApplicationWorker 并让所有其他工作人员从该类继承。在这个新的父类中,您可以做所有工作人员共有的所有事情。

当你有两个这样的工人时

class FooWorker
  include Sidekiq::Worker
  def perform
    # do something
  end
end

class BarWorker
  include Sidekiq::Worker
  def perform
    # do something else
  end
end

那么你可以像这样使用继承:

class ApplicationWorker
  include Sidekiq::Worker
  Time.zone = 'UTC'
end

class FooWorker < ApplicationWorker
  def perform
    # do something
  end
end

class BarWorker < ApplicationWorker
  def perform
    # do something else
  end
end

【讨论】:

  • 还是不行:NoMethodError: undefined method 'now' for nil:NilClass
猜你喜欢
  • 2019-01-20
  • 2020-05-06
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多