我目前正在重构现有项目的服务器端。
我们正在使用guice绑定特定模块及其对象。
在过去的两周内,我们经常遇到一个问题,看起来guice正在混淆一些使用过的对象实例。
问题是一个类,它可以构建一个将插入数据库的String。这个类是从一个rpc服务中使用的,它可以连续调用很快。所以会发生什么是RPC服务1调用此类,同时RPC服务2也调用此类并更改用于字符串构建的全局参数。构建器类有点愚蠢,因为它从方法中获取一个参数将参数的某些部分设置为全局变量并处理该字符串。
我认为主要问题是全局变量,但我不知道如何以优雅的方式摆脱它们。它们用于从init方法调用的所有其他方法(例如,startMethod()调用buildStringOne(),buildStringTwo(),并且这些方法正在访问在startMethod()中设置的两个全局变量。
有没有更好的方法来绑定这个对象,还是我需要删除全局变量并在其他方法中将它们作为参数提供?
感谢您的帮助。
答案 0 :(得分:0)
使用共享可变状态是在寻找麻烦。听起来你的根本问题确实是一个线程安全问题。但是,您不必通过使可变状态线程安全来解决线程安全问题 - 您也可以这样做,以便状态仅对一个线程可见。
您可以使用Guice的请求范围对象来解决此问题。如果麻烦的类可以以注入它的方式使用,Guice将为每个servlet请求提供一个新实例。如果您在范围比请求更长的类(例如Singleton)中使用它,请注入Provider。调用get()将为调用线程正在处理的请求返回适当的Foo实例。
有关详情,请参阅https://code.google.com/p/google-guice/wiki/ServletModule#Using_RequestScope。