2

나는 엔진 내부에서 ActiveResource 객체를 호출하고 있으며 쓰레드를 안전한 방법으로 설정해야한다.레일즈 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의 영향을받습니다. 본질적으로, 나는 클래스 변수 대신에 Thread.current에 헤더를 저장하기 위해 self.headers() 메소드를 덮어 쓴다.

그것은 다음과 같습니다

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