将Web服务公开为无状态会话bean的任何线程安全性好处?

时间:2012-07-13 21:41:28

标签: web-services java-ee annotations jax-ws stateless-session-bean

将Web服务公开为无状态会话bean是否存在与线程安全相关的好处?
(如果我错了,请纠正我)但我认为Web服务不是线程安全的,就像Servlet一样,服务器只创建一个Web服务类实例(每个请求不是一个实例)。

我不知道它们是否是像无状态bean一样从一个bean池分配的 - 是由应用服务器提供的。 我试图找到是否将@Stateless annoation与已经使用@WebService注释注释的Web服务一起使用 - 这将迫使应用服务器开始为每个传入请求从池中分配它们。这样我就知道我会为每个传入的请求创建一个单独的实例吗?

1 个答案:

答案 0 :(得分:9)

<强>简介

Web服务端点使用的实例数取决于您使用的框架。

如果你使用一个简单的端点(即带有Apache CXF或Spring webservices的JAX-WS),你将拥有一个针对所有线程/请求的服务实例(如你所说,Servlets)。因此,根据定义,这种服务意味着无国籍。但是,如果您需要向服务添加一些状态,您可以这样做,但是由开发人员来确保服务线程安全。

使用EJB时​​,您可以获得更大的灵活性:如果您使用无状态bean,您将拥有一个实例池来管理所有请求(如果您的poolSize = 1,您将获得与Apache CXF相同的行为)。同样,您可以向无状态bean添加一些状态,但是使其线程安全更难,因为您有一个要管理的实例池。但是如果你需要一个状态,你可以使用有状态的bean来建立一个框架,使你的线程安全生活更轻松。

有关服务状态的一些提示

如果您未在服务中保持状态,则您的Web服务是线程安全的。换句话说,根据定义,如果线程安全,则为无状态服务。

如果您需要一些应该由所有线程/请求共享的状态,您可以将某些状态添加到无状态服务(JAX-WS或poolSize = 1的无状态会话bean),但是您需要使其线程安全,添加sycn块(请不要同步您的@WebMethod)。 重要事项:理论上(在实践中),您永远不应该向无状态会话bean添加状态,因为池可以在“想要”时销毁/创建实例。

如果你需要保留一个只能由当前线程/请求使用的状态,你可以使用ThreadLocal变量向无状态服务添加一些状态,或者更容易使用有状态会话bean。

现在,最后,回答你的问题

  1. 当且仅当你使它们成为线程安全时,无状态会话bean是线程安全的:它们不应该具有状态: - )
  2. 经典Web服务和无状态会话Bean Web服务之间的唯一区别,如果第一个将具有单个实例,第二个将使用实例池。如果你的poolSize = 1,你会得到相同的效果,但理论上,池可以在“想要”时销毁你的实例。
  3. 希望它有所帮助,