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生成异步客户端的另一种方法:)
| 归档时间: |
|
| 查看次数: |
7737 次 |
| 最近记录: |