是否有公开Web服务作为无状态会话bean的任何线程安全相关的好处是什么?
(纠正我,如果我错了),但我认为Web服务不是线程安全,如servlet只有一个Web服务类的实例是(每个请求不是一个实例)服务器创建。
我不知道他们是否是从象无状态豆豆的池中分配做是 - 由应用服务器。 我想找到我如果用@Stateless annoation与已经使用@WebService annotation-意志,强制应用程序服务器,开始从每个传入请求池分配这些注释的Web服务。 这样,我知道肯定对每个进来的请求,我将一个单独的实例创建?
介绍
由Web服务端点使用实例的数量取决于您所使用的框架。
如果你使用一个简单的端点(即JAX-WS与Apache CXF或Spring Web服务),您将拥有所有线程/请求一个服务实例(如你所说,Servlet的)。 因此,通过定义这种服务都意味着是无状态的。 但是,如果你需要一些状态添加到服务,你可以做到这一点,但是是由开发人员,使服务线程安全的。
当您使用EJB,你有更多的灵活性:如果您使用无状态豆你将有实例池来管理所有的请求(如果你的poolSize = 1你的Apache CXF的相同的行为)。 同样,你可以添加一些状态,无状态Bean,但要线程安全的就更难了,因为你有实例池来管理。 但是,如果你需要的状态,你可以使用一个状态bean有一个框架,让你的生活有关线程安全更方便。
有关服务状态的一些提示
如果你不保持一个状态,在服务您的Web服务是线程安全的。 换句话说,一个无状态的服务,如果线程定义安全。
如果你需要一些状态应该由所有线程共享/请求你可以添加一些状态到一个状态服务(JAX-WS或poolSize = 1无状态会话bean),但你需要使它线程安全的,添加sycn块(请不要同步您的@WebMethod
)。 重要提示:在理论(和实践),你不应该的状态添加到一个无状态会话bean,因为池可以摧毁/创建实例时,“希望”。
如果您需要保留,将只由当前线程使用状态/请求您可以使用添加一些状态到一个无状态的服务ThreadLocal
变量,或者更方便地使用有状态会话Bean。
现在,终于,回答你的问题
- 无状态会话bean是线程安全的,当且仅当你让他们线程安全的:他们不应该有一个状态:-)
- 一个典型的Web服务和无状态会话bean Web服务之间的唯一不同如果第一个将有一个实例,而第二个将使用实例池。 如果您poolSize = 1,你得到相同的效果,但在理论上,当“希望”池可以摧毁你的实例。
希望有帮助,
文章来源: Any thread safety benefits of exposing a web service as a stateless session bean?