0

我正在研究一般的 Jax-WS 规范及其在 Glassfish 3.1.2 上的实现。我构建了一个简单的标准示例,其中使用通过 wsimport 生成的工件从 jsp 页面调用基于 jax-ws soap 的 Web 服务(Web 服务和 jsp 页面都部署在同一 EAR 中的 Glassfish 上,但在 2 个不同的战争中) .

一切都按预期工作,但我有一个问题:查看应用程序日志,Glassfish 似乎每次调用它都会创建一个新的 web 服务实例。我想知道 Java 在哪里正式定义了 Web 容器应该如何管理 Web 服务实例,以及开发人员是否可以自定义这种行为。

我在这里阅读了 jax-ws 2.1 规范

http://download.oracle.com/otndocs/jcp/jaxws-2.1-mrel2-eval-oth-JSpec/

但在谈到如何手动使用 Endpoint 类发布 Web 服务时,我只发现了一条线索(第 5.2.2 节“发布”,第 69 页):

“一个端点由一个充当 Web 服务实现的对象(这里称为实现者)加上一些配置信息......

通常会调用 Endpoint 来服务并发请求,因此应编写其实现程序以支持多线程。可以像往常一样使用 synchronized 关键字来控制对代码关键部分的访问。为了更好地控制用于分派传入请求的线程,应用程序可以直接设置要使用的执行器......”

甚至在 Jax-WS 2.2 规范(由 Glassfish 3 使用)中也存在此注释。

实际上,如果我只使用 JavaSE 7(包括 Jax-WS 2.2)构建一个 web 服务,这个描述是正确的,因为只有一个 web 服务实例。JavaEE 是否有任何理由不遵守此政策?

非常感谢你的帮助,

尼科

4

1 回答 1

1

我在本规范 (JSR-109) 中找到了答案:

http://jcp.org/aboutJava/communityprocess/mrel/jsr109/index3.html

它描述了 Jax-WS 如何在 JavaEE 上工作:

" 4.1 客户端编程模型(第 18 页)

客户端必须假设 Web 服务的方法没有跨多个 Web 服务方法调用持久的状态。客户端可以将 Web 服务实现视为无状态的。

客户端无法控制服务器上 Web 服务实现的生命周期。客户端不会创建或销毁称为端口的 Web 服务实例。客户端只访问端口。端口或 Web 服务实现的实例的生命周期由承载 Web 服务的运行时管理。一个端口没有身份。这意味着客户端无法将一个端口与其他端口进行比较以查看它们是否相同或相同,客户端也无法访问特定的端口实例。

5.3.2.4.2 JAX-WS 的 Web 容器编程模型(第 42 页)

服务实现必须是无状态对象。服务实现 Bean 不得在 bean 实例的数据成员内或实例外部的方法调用中保存客户端特定状态。容器可以使用任何 bean 实例来服务请求。

5.3.4 服务实现 Bean 生命周期(第 43 页)

在为请求提供服务之前,容器必须实例化一个服务实现 Bean 并为方法请求做好准备。容器可以汇集服务实现 Bean 的方法就绪实例,并在方法就绪状态的任何实例上分派方法请求。"

此外,规范规定 JavaEE 不得使用 Endpoint 类来发布 Web 服务:

" 5.3.3 发布端点 – javax.xml.ws.Endpoint(第 43 页)

JAX-WS 提供了使用 javax.xml.ws.Endpoint API 动态创建和发布 Web 服务端点的功能。在托管环境中使用此功能被认为是不可移植的。要求 Servlet 和 EJB 容器都不允许动态发布 Endpoint,方法是不授予 publishEndpoint 安全权限。"

于 2013-10-20T10:41:53.633 回答