繁体   English   中英

对需要current_user的sidekiq作业禁用public_activity跟踪

[英]disable public_activity tracking for sidekiq jobs that require current_user

总之,我得到一个错误, public_activity正在寻找current_user而期间更新模型sidekiq工作。 这是预期的,因为没有current_user ...。如何在作业运行时禁用public_activity跟踪? 我曾尝试在工作期间更改PublicActivity.enabled = falseProspect.public_activity_off ,但tracked owner: Proc.new{ |controller, model| controller.current_user } tracked owner: Proc.new{ |controller, model| controller.current_user }似乎仍在捡起它并寻找current_user

我怎样才能有sidekiq (或工作)进行更新,而不public_activity干扰?

在工作期间, sidekiqcurrent_user设置为虚拟用户会更好吗? 我认为这不是一个好主意,因为那样我们以后就需要过滤掉它。

错误:

2016-04-20T17:24:53.728Z 20447 TID-owpsaw07w ProspectDataAggregationWorker JID-bad79ab6a073d57d7388e931 INFO: start
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w ProspectDataAggregationWorker JID-bad79ab6a073d57d7388e931 INFO: fail: 0.01 sec
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: {"class"=>"ProspectDataAggregationWorker", "args"=>[1], "retry"=>false, "queue"=>"default", "jid"=>"bad79ab6a073d57d7388e931", "created_at"=>1461173093.728181, "enqueued_at"=>1461173093.7282372}
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: NoMethodError: undefined method `current_user' for nil:NilClass
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: /Users/cj/RubymineProjects/revenue_management_system/app/models/prospect.rb:3:in `block in <class:Prospect>'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:14:in `resolve_value'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:315:in `prepare_relation'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:281:in `prepare_settings'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:250:in `create_activity'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/actions/update.rb:14:in `activity_on_update'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:432:in `block in make_lambda'

完整错误: https//gist.github.com/cdesch/190c46c69213a37e4162e50727531761

模型:

class Prospect < ActiveRecord::Base
  include PublicActivity::Model
  tracked owner: Proc.new{ |controller, model| controller.current_user }
      ...
    end

Sidekiq工作/工人

class ProspectDataAggregationWorker
  include Sidekiq::Worker

  sidekiq_options :retry => false # job will be discarded immediately if failed

  def perform(account_id)
    #Prospect.public_activity_off
    PublicActivity.enabled = false

    account = Account.where(id: account_id).first
    prospects = account.prospects

    prospects.each do |prospect|
      prospect.update_based_on_primary_assessment!
    end
    PublicActivity.enabled = true

    #Prospect.public_activity_on
  end
end

我也在public_activity问题中发布了相同的问题

如果您挽救了错误,则可以先解决问题,然后再解决此问题:

tracked owner: Proc.new do |controller, model| 
  controller.current_user rescue nil_or_User_new_or_something_else
end

这个问题最终没有sidekiqpublic_activity宝石。 进行Prospect.public_activity_off的工作(如下),即使我之前没有做过。 问题在于, sidekiq进程正在缓存模型和工作程序,因此,在对sidekiq进行回收/重新启动之前,我对模型所做的任何更改都不会生效。 之后,以下功能运行良好。

def perform(account_id)

   Prospect.public_activity_off
   ...
end 

或以下内容:

class ApplicationWorker
  include Sidekiq::Worker

   def perform(*args)
     PublicActivity.without_tracking { super(*args) }
   end
end

本质上的问题不是代码问题,而是开发人员问题。 :-)更改工作人员后,重新启动sidekiq

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM