2

我正在调用引擎内的 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()

在问了这个问题并做了一些阅读之后,看起来这不是线程安全的,因为我在类级别设置了标题。

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

4

1 回答 1

2

解决了这个问题。解决方案受这个问题的影响。本质上,我重写了 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
于 2012-09-20T14:02:48.200 回答