1

我使用的是 SAP NetWeaver 7.3 EHP 1(JEE5 认证),我为现有的 WSDL 生成了一个 Web 服务框架。此 Web 服务中的所有方法都是非阻塞的,因此使用@Oneway. 服务本身工作得很好。

不过,我还需要访问注入WebServiceContext,这就是麻烦开始的地方。我可以很好地注入上下文,但对它的每次调用都只会在特定于服务器的 NPE 或 ISE 中结束。我有点能理解,因为非阻塞调用是由 SAP 的 JAX-WS 实现异步执行的。但是,我尝试通过查看 JAX-WS 规范来验证这种行为。现在我要么是盲人,要么规范没有明确说明 aWebServiceContext不能用于非阻塞 Web 方法。事实上,在整个最新版规范的第 5.3 章中,@Oneway都没有提到一次。主要描述是

javax.xml.ws.WebServiceContext 接口使端点实现对象以及可能共享其执行上下文的任何其他对象都可以访问与正在服务的请求有关的信息。在调用其 Web 服务方法之一之外的组件的 WebServiceContext 上调用任何方法的结果是未定义的。如果一个实现检测到这样的用法,它应该抛出一个 java.lang-.IllegalStateException。

我想重点是“请求被服务”的定义。在 SOAP 操作的异步处理时,HTTP 请求已经完成。但是话又说回来,我没有访问“在调用其 Web 服务方法之外”的上下文。我很困惑...

你们有谁知道我是否应该被允许以WebServiceContext非阻塞的网络方法访问?谢谢!

4

1 回答 1

2

你是对的:规范没有说明这个限制——它只是隐含的暗示。

来自 JAX-WS 规范(2.2 Rev A):

WebServiceContext 被视为可在端点初始化时设置的可注入资源。然后,WebServiceContext 对象将使用线程本地信息返回正确的信息,而不管有多少线程同时用于为发往同一端点对象的请求提供服务。

应该在端点存在的情况下可操作,但前提是在设置请求上下文信息并将请求上下文信息存储到线程本地内存存储中的同一线程中使用。鉴于 WebServiceContext 主要是 MessageContext 信息,即 HTTP 请求/Servlet 请求/WSDL 操作设置,线程本地上下文信息可能需要由最初编组 SOAP/HTTP 请求的线程填充,这意味着后面的异步处理线程没有此信息可用。仅基于阅读-尚未测试此组合。

于 2013-03-18T05:46:48.507 回答