【问题标题】:Setting Rails ActiveResource headers in a thread safe way以线程安全的方式设置 Rails ActiveResource 标头
【发布时间】:2012-09-19 15:10:17
【问题描述】:

我正在调用引擎内的 ActiveResource 对象,我需要以线程安全的方式设置标头。

我在引擎中有 /lib/mymodule.rb,它看起来像这样:

module MyModule
  def self.my_method()
    begin
       data = WebResource.find(:all) # Where WebResource < ActiveResource::Base
    rescue
       data = nil
    end

    return data
  end
end

然后在我的视图/控制器中,我大致这样称呼这个方法:

WebResource.headers[:some_id] = cookies[:some_id]
MyModule::my_method()

在询问this question 并阅读后,看起来这不是线程安全的,因为我在类级别设置了标题。

以线程安全的方式设置这些标头的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 thread-safety activeresource


    【解决方案1】:

    解决了这个问题。解决方案受this question 影响。本质上,我重写了 self.headers() 方法以将标头存储在 Thread.current 中,而不是类变量。

    看起来像这样:

    class WebResource < ActiveResource::Base
    
      # ...
    
      class << self
    
        def headers
          Thread.current["active.resource.currentthread.headers"] = {} if Thread.current["active.resource.currentthread.headers"].blank?
          Thread.current["active.resource.currentthread.headers"]
        end
    
      end
    end
    

    【讨论】:

    • ActiveResource 现在默认执行此操作。它将标头、站点、代理、基本身份验证和连接本身存储在线程局部变量中,以使其全部线程安全:github.com/rails/activeresource/commit/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2013-11-12
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多