我正在研究一般的 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 是否有任何理由不遵守此政策?
非常感谢你的帮助,
尼科