2013-03-08 58 views
1

我在SAP NetWeaver 7.3 EHP 1(JEE5認證)上,我爲現有的WSDL生成了一個Web服務框架。這個Web服務中的所有方法都是非阻塞的,因此用@Oneway註釋。該服務本身工作得很好。JAX-WS - 將WebServiceContext注入@WebService,只有@Oneway方法

雖然我也需要訪問一個注入的WebServiceContext,這是麻煩開始的地方。我可以很好地注入上下文,但每次調用都只會在服務器特定的NPE或ISE中結束。我有些可以理解,因爲非阻塞調用是由SAP的JAX-WS實現異步執行的。但是,我試圖通過查看JAX-WS規範來驗證此行爲。現在我要麼是盲人,要麼規範沒有明確說明WebServiceContext不能用於非阻塞網絡方法。實際上,在最新版規範的第5.3章中,@Oneway並沒有提及一次。主要描述是

的javax.xml.ws.WebServiceContext接口使得能夠爲一個 端點實現對象和潛在的任何其他對象 共享它的執行上下文來訪問關於所述被服務 請求信息。 調用 其中一個Web服務方法之外的組件調用 WebServiceContext上的任何方法的結果未定義。如果一個實現檢測到這種用法,應該拋出一個 java.lang.IllegalStateException異常。

我想這一點是「請求服務」的定義。在異步處理SOAP操作時,HTTP請求已完成。但是,再次,我沒有訪問上下文「之外的一個調用,如果它的Web服務方法」。我很困惑...

你們有沒有人知道我是否應該被允許在非阻塞網絡方法中訪問WebServiceContext?謝謝!

回答

2

你是對的:規範沒有提到這個限制 - 它只是模糊的暗示。

從JAX-WS規範(2.2版本A):

的WebServiceContext被視爲一種可注射的資源,可以是 組在端點處被初始化的時間。 WebServiceContext 對象然後將使用線程本地信息返回正確的 信息,無論有多少線程正在同時使用 來服務請求到同一個端點對象的請求。

應該是操作過的端點的存在,但只有當在同一線程中使用的設置和存儲在請求的上下文信息到線程局部存儲器。鑑於WebServiceContext主要是MessageContext信息,即HTTP請求/ Servlet請求/ WSDL操作設置,線程本地上下文信息可能需要由最初封送SOAP/HTTP請求的線程填充,這意味着稍後的異步處理線程沒有這個信息可用。只是基於閱讀 - 沒有測試過這種組合。