我使用的是SAP NetWeaver 7.3 EHP 1(经过JEE5认证),我已经为现有的WSDL创建了一个Web服务框架。此Webservice中的所有方法都是非阻塞的,因此使用@Oneway
进行注释。服务本身运作得很好。
我还需要访问注入的WebServiceContext
,这就是麻烦开始的地方。我可以很好地注入上下文,但每次调用它最终都会出现在服务器特定的NPE或ISE中。我有点可以理解,因为非阻塞调用是由SAP的JAX-WS实现异步执行的。但是,我尝试通过查看JAX-WS规范来验证此行为。现在我要么是盲目的,要么规范没有明确说明WebServiceContext
不能用于非阻塞Web方法。事实上,在最新版规范的第5.3章的整个过程中,@Oneway
没有被提及过一次。主要描述是
javax.xml.ws.WebServiceContext接口使得它成为可能 端点实现对象以及可能的任何其他对象 共享其执行上下文以访问与该信息相关的信息 请求被送达。 调用任何方法的结果 WebServiceContext的一个组件之外的一个组件的调用 Web服务方法未定义。一个实现应该抛出一个 java.lang- .IllegalStateException如果它检测到这种用法。
我想重点是“请求服务”的定义。在异步处理SOAP操作时,HTTP请求已经完成。但话说回来,我没有访问“如果它的Web服务方法调用一个”之外的上下文。我很困惑......
你们有没有人知道我是否应该被允许以非阻止网络方式访问WebServiceContext
?谢谢!
答案 0 :(得分:2)
你是对的:规范没有说明这个限制 - 它只是模糊地隐含着。
来自JAX-WS规范(2.2版本A):
WebServiceContext被视为可注入的资源 在端点初始化时设置。 WebServiceContext 然后,对象将使用线程本地信息返回正确的信息 无论同时使用多少线程,都会显示信息 处理发往同一端点对象的请求。
应该在端点存在的情况下运行,但只有在设置并将请求上下文信息存储到线程本地内存存储的同一线程中使用。鉴于WebServiceContext主要是MessageContext信息,即HTTP请求/ Servlet请求/ WSDL操作设置,线程本地上下文信息可能需要由最初编组SOAP / HTTP请求的线程填充,这意味着稍后的异步处理线程没有此信息可用。只是基于阅读 - 避免测试这种组合。