2013-03-08 76 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请求的线程填充,这意味着稍后的异步处理线程没有这个信息可用。只是基于阅读 - 没有测试过这种组合。