2011-09-29 121 views
0

我目前正在重構現有項目的服務器端。Threadsafe Guice綁定

我們現在使用guice綁定特定的模塊及其對象。

在過去兩週中,我們經常有這看起來像吉斯是混合了一些使用對象實例的問題。

的問題是一類是承擔一切建立,這將在數據庫中插入一個字符串。這個類是從一個可以連續調用的rpc服務中使用的。所以會發生什麼是RPC服務1調用這個類,同時RPC服務2也調用這個類,並改變用於字符串構建的全局參數。構建器類有點愚蠢,因爲它從方法的param中設置param的一些部分作爲全局變量並處理字符串。

我認爲主要的問題是全局變量,但我不知道我怎麼能在一個優雅的方式擺脫他們。它們用於從init方法調用的所有其他方法(例如,startMethod()調用buildStringOne(),buildStringTwo()以及那些正在訪問在startMethod()中設置的全局變量)。

有沒有更好的辦法,我怎麼能結合這個對象還是我需要刪除的全局變量,爲他們提供在其他方法放慢參數?

感謝您的幫助。

回答

0

使用共享可變狀態需要麻煩。這聽起來像是你的根本問題實際上是一個線程安全問題。但是,您不必通過使可變狀態線程安全來解決線程安全問題 - 您也可以使其成爲只有一個線程可見的狀態。

您可以用Guice的請求範圍的對象,以解決這個問題。如果麻煩的類可以被注入的方式使用,Guice將爲每個servlet請求提供一個新的實例。如果您在比請求範圍更長的類中使用它(例如Singleton),請注入一個Provider。調用get()將爲調用線程正在處理的請求返回適當的Foo實例。

更多見https://code.google.com/p/google-guice/wiki/ServletModule#Using_RequestScope