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

rob*_*jaj 3 annotations web-services jax-ws stateless-session-bean java-ee

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

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

gga*_*iao 9

介绍

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

如果您使用一个简单的端点(即JAX-WS与Apache CXF或Spring Web服务),您将拥有一个针对所有线程/请求的服务实例(如您所说,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,您将获得相同的效果,但理论上,池可以在"想要"时销毁您的实例.

希望它有所帮助,