簡體   English   中英

Glassfish 3上的Jax-WS 2.2 Web服務實例管理

[英]Jax-WS 2.2 web service instances management on Glassfish 3

我正在研究Jax-WS規范及其在Glassfish 3.1.2上的實現。 我構建了一個簡單的標准示例,其中使用通過wsimport生成的工件從jsp頁面調用基於jax-ws soap的Web服務(Webservice和jsp頁面都部署在同一EAR中的Glassfish上,但是經歷了兩次不同的戰爭) 。

一切都按預期工作,但我有一個問題:查看應用程序日志,似乎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服務實現(在此稱為實現器)的對象以及一些配置信息組成...

通常將調用一個端點來服務於並發請求,因此應編寫其實現者以支持多個線程。 可以照常使用synced關鍵字來控制對代碼關鍵部分的訪問。 為了更好地控制用於調度傳入請求的線程,應用程序可以直接設置要使用的執行程序...”

即使在Jax-WS 2.2規范(由Glassfish 3使用)中也存在此注釋。

實際上,如果我僅使用JavaSE 7(包括Jax-WS 2.2)構建Web服務,則此描述是正確的,因為只有一個Web服務實例。 有什么理由導致JavaEE不遵守此政策?

非常感謝你的幫助,

尼科

我找到了有關此規范(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 Service端點的功能。 在托管環境中,無法使用此功能。 要求Servlet和EJB容器都通過不授予publishEndpoint安全權限來動態禁止端點的發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM