2011-09-29 62 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