异步Web服务与JAX-WS要求:使用wsimport的支持异步或推出自己的?(Asynchrono

2019-06-25 22:46发布

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

<enableAsyncMapping>true</enableAsyncMapping>

在其绑定部分。 如果您使用的JAX-WS注解的Java类的自下而上的方法,你不能直接在WSDL,因为WSDL是Web服务器上生成的构件做到这一点。 相反,您使用建立一个像Ant或Maven工具,包括当在WSDL执行的wsimport此绑定。

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

Future<?>

Response

这是一个未来。

杨阅读的文章后,我的问题是,为什么不只是推出使用Executors及期货我自己的异步Web服务调用。 不要通过的wsimport创建的工件提供一些优势,我看不出在滚你自己的方法吗?

如果任何人有两种方法的经验或见解我会感谢您的反馈。

Answer 1:

从理论上讲,产生异步客户端就不需要阻塞线程。 通过传递一个异步处理,该系统可以使用NIO为事件注册的Web服务调用完成时,它可以调用处理程序。 没有线程需要不惜一切阻止。

如果你把你的同步 Web服务调用到执行者,它仍然会结束阻塞线程,直到结果到来,但至少有这种阻塞被限制在执行程序中的线程池。

只要你有数百个线程左右浮动,您的系统性能将由于上下文切换降解。

无论是引擎盖下的Web服务库实际使用NIO是另一回事。 它不会出现由JAX-WS规范要求。 使用JDK 1.6和设置一个破发点服务器端,我设置100个客户端关闭调用服务器。 使用JVisualVM我连接到客户端,可以看到,它已经创造了每一个调用新线程的服务器。 垃圾!

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

那么为什么要使用JAX-WS API,而不是建立自己的? 由于构建自己需要更多的工作;-)



Answer 2:

我知道,它没有达到促使问题,但只是补充列入问题一个信息:

“相反,你使用像建Ant或Maven工具,包括当在WSDL执行的wsimport这种结合。”

可以通过使用选项-b到的wsimport一个添加自定义XML文件生成异步客户端:

例:

wsimport -p helloAsyncClient -keep http://localhost:8080/helloservice?wsdl -b customAsync.xml

该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>

这只是另一种方式,通过使用Ant或Maven产生异步客户端超越:)



文章来源: Asynchronous web services calls with JAX-WS: Use wsimport support for asynchrony or roll my own?