2

我正在調用引擎內的ActiveResource對象,並且需要以線程安全方式設置標題。以線程安全方式設置Rails 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並做了一些閱讀之後,看起來這不是線程安全的,因爲我在類級別設置了標題。

以線程安全方式設置這些頭文件的最佳方法是什麼?

回答

2

解決了這個問題。該解決方案受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 
+0

的ActiveResource在默認情況下做到這一點。它將頭文件,站點,代理,基本身份驗證和連接本身存儲在線程局部變量中,以使其全部線程安全:https://github.com/rails/activeresource/commit/538588ddba9ffc9bf356790e9186dc7e6adad12f – mltsy