【问题标题】:JAX-WS web services threading modelJAX-WS Web 服务线程模型
【发布时间】:2012-07-13 18:03:11
【问题描述】:

(1) 好吧,我对 JAX-WS Java Web 服务的线程模型感到很困惑。我读到它们不是线程安全的。那么他们应该如何服务多个并行请求呢?鉴于它总是已知的(大多数情况下),它们将同时被多个客户端调用。

(2) 应用服务器是否为每个请求创建一个新的 Web 服务实例(就像它维护一个无状态会话 bean 池,为请求分配一个,一旦请求完成,它就会返回到池中)。您可以在应用服务器控制台(GlassFish 或 JBoss 或 WebSphere)中配置该池大小吗?

(3) 我还在这里发现了 @Threadsope 注释,它为每个请求创建新线程..
http://jax-ws-commons.java.net/thread-scope/
这是一个不错的选择吗?我确信人们正在以其他标准方式解决线程安全和并行请求问题 - 请告知。

【问题讨论】:

  • 这是我试图寻找答案的问题。我得到了一些信息(不太清楚)。我学到的是,服务器为 web 服务(如 servlet)创建单个实例,因此它们(服务)不是线程安全的。因此,虽然编码本身不会将任何线程特定数据保留为实例变量/静态变量。
  • @thinksteep 我有一个回复你..看看这个..希望它回答你的一些问题..stackoverflow.com/questions/11478756/…

标签: java multithreading web-services thread-safety jax-ws


【解决方案1】:

应用服务器包含一个 bean 池。
使用无状态会话 bean 时,不能保证您在使用会话时会获得相同的实例。
然而,正如我所提到的,bean 是由一个池管理的,在其中持有一个状态,这是一个坏主意。
不过,我认为 EJB bean 与您的需求没有任何关系。
请注意,在您提供的示例中,DataService 和连接都是根据请求创建的。这有点贵。
我会考虑仅将 ThreadLocal API 用于连接,并从连接池中获取它。
您可以通过阅读有关 ThreadLocal 和阅读有关 DB connection pools. 的信息自行实现这些


总而言之 - 我认为 EJB 与这里无关。
不要同时保留您的服务类和线程本地的字段,而只保留您将为每个请求分配的必要字段。 (在您展示的示例中 - 这是连接)

【讨论】:

  • 感谢您的回复...您能否解决上述 (1) 和 (2) 问题...它们是关于 Web 服务生命周期的问题,我还没有找到任何好的文档来回答那些问题..
  • 再一次,我认为这是一个糟糕的方法,你应该选择无状态行为。我使用 JAX-RS 开发较少。根据我在文档中看到的内容,您可以使用 @ThreadScope 创建每个请求线程的服务实例,但这很糟糕。还有一点 - 如果您发现我给了您帮助,请随时支持我的回答,我将不胜感激。
  • 谢谢@zaske。如果您解释“为什么”您认为这是一个坏主意,我将不胜感激...您只是发表了没有解释的声明来支持它...:)
  • 另外@zaske 我无法理解每个请求的线程如何“不是”无状态方法 - 您的回复似乎表明......
  • 我仍在寻找上述 (1) 和 (2) 的解释或参考链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多