我正在使用SAP NetWeaver 7.3 EHP 1(已通过JEE5认证),并且已经为现有WSDL生成了Web服务框架。该Web服务中的所有方法都是非阻塞的,因此用@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服务方法之外”。我很困惑...
你们是否有人知道是否应允许我以非阻塞性Web方法访问WebServiceContext
?谢谢!
最佳答案
您是对的:规范对此限制一无所知-只是隐含地暗示。
从JAX-WS规范(2.2 Rev A):
WebServiceContext被视为可注入资源,可以
在端点初始化时设置。 WebServiceContext
然后,对象将使用线程本地信息返回正确的
信息,无论同时使用多少个线程
服务寻址到同一端点对象的请求。
应该在存在端点的情况下才可操作,但仅当在用于建立请求上下文信息并将其存储到线程本地内存存储的同一线程中使用时才可使用。假定WebServiceContext主要是MessageContext信息,即HTTP请求/ Servlet请求/ WSDL操作设置,那么线程本地上下文信息可能需要由最初编组SOAP / HTTP请求的线程来填充,这意味着以后的异步处理线程没有此信息可用。仅基于阅读-尚未测试此组合。