使用JAX-WS调用异步Web服务:使用wsimport支持异步还是自己滚动?

Dea*_*lze 5 asynchronous web-services jax-ws jax-ws-customization

有一个由年轻的杨优秀的文章,介绍了如何使用的wsimport创建具有异步Web服务调用Web服务客户端工件.异步要求WSDL具有标记

<enableAsyncMapping>true</enableAsyncMapping>

在其绑定部分.如果您使用自下而上的方法和JAX-WS带注释的Java类,则无法直接在WSDL中执行此操作,因为WSDL是Web服务器上生成的工件.相反,当在WSDL上执行wsimport时,您使用Ant或Maven等构建工具来包含此绑定.

生成的客户端工件具有返回a的异步方法调用

Future<?>
Run Code Online (Sandbox Code Playgroud)

或者a

Response
Run Code Online (Sandbox Code Playgroud)

这是一个未来.

阅读杨的文章后我的问题是为什么不只是使用Executors和Futures滚动我自己的异步Web服务调用.wsimport创建的工件是否提供了一些我无法通过自己的方法看到的优势?

如果有人对这两种方法都有经验或见解,我将非常感谢您的反馈.

Ant*_*era 10

理论上,生成的异步客户端不需要阻塞线程.通过传递AsyncHandler,系统可以在Web服务调用完成时使用NIO注册事件,并且可以调用该处理程序.没有线程需要阻止.

如果将同步 Web服务调用放入执行程序,它仍将最终阻塞线程,直到结果到达,尽管至少此阻塞仅限于执行程序中的线程池.

只要有数百个线程浮动,您的系统性能就会因上下文切换而降低.

引擎盖下的Web服务库是否实际使用NIO是另一回事.它似乎不是JAX-WS规范所要求的.使用JDK 1.6并设置断点服务器端,我设置了100个客户端来调用服务器.使用附加到客户端的JVisualVM,可以看到它每次调用服务器时都创建了一个新线程.垃圾!

在Web上环顾四周,我发现Apache CXF支持限制异步调用中使用的线程池.果然,利用CXF与生成的客户端,并把正确的库上所讨论的类路径这里,复验结果显示,目前正在使用的只有25个线程.

那么为什么要使用jax-ws API而不是自己构建?因为建立自己需要更多的工作;-)


小智 6

我知道它没有达到提示的问题,只是补充了问题中包含的一项信息:

“相反,当在WSDL上执行wsimport时,可以使用Ant或Maven之类的构建工具来包含此绑定。”

可以通过使用-b选项向wsimport添加自定义xml文件来生成异步客户端:

例:

wsimport -p helloAsyncClient -keep http://localhost:8080/helloservice?wsdl -b customAsync.xml
Run Code Online (Sandbox Code Playgroud)

customAsync.xml内容:

<jaxws:bindings
        wsdlLocation="http://localhost:8080/helloservice?wsdl"
        xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
        <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)

这是通过使用ant或maven生成异步客户端的另一种方法:)