[英]Advantages of using a Dynamic Client with JAX-WS
使用带有JAX-WS服务的动态客户端与仅使用生成的客户端类相比有什么优势? 有什么缺点?
**对于我的特定情况,我使用Apache CXF,我不确定其他库允许“动态”客户端。
- 我想我不需要添加这个,但是......我正在寻找非显而易见的(我知道......主观的)优点。 我不需要别人告诉我不使用生成的类的优点是我不需要生成类。
那么,CXF文档非常清楚动态客户端的优势:
CXF支持多种替代方案,允许应用程序在没有SEI和数据类的情况下与服务进行通信。 JAX-WS指定了JAX-WS Dispatch API,以及用于读取和写入XML的Provider接口。 但是,此页面描述了CXF的动态客户端工具。 对于动态客户端,CXF在运行时生成SEI和bean类,并允许您通过使用对象的API调用操作,或者使用反射调用完整代理 。
换句话说,您不需要类的定义,如下面的文档示例所示:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("echo.wsdl");
Object[] res = client.invoke("echo", "test echo");
System.out.println("Echo response: " + res[0]);
关于缺点,它们非常明显(这是付出的代价):你正在操纵字符串,你失去了强烈的打字。
优点是避免生成和包含代码。 在某些环境中,这是一个问题。 如果您的环境中没有包含生成代码的障碍,那么动态客户端是一个坏主意,速度更慢,更麻烦。
动态客户端速度较慢,因为代码(我写了一些代码)必须:
它更麻烦,因为您的数据模型中没有任何复杂对象的bean类。 你需要使用反射。
请记住,动态客户端与调用接口不同。
使用动态客户端的优点是您不需要在运行时之前生成存根。 这允许您通常调用在运行时可能不了解的服务。
如果您准确了解客户端代码将要调用的Web服务以及在客户端的生命周期内不会更改,则生成的客户端类很棒。
如果其中任何一种情况不是这样,那么您需要考虑客户如何处理这些情况。 Dispatch API使您可以灵活地动态生成Web服务调用,而无需熟悉所访问的服务。 这显然需要代码来支持构建该调用所需的配置选项。
尽管如此,服务器端接口的开发人员/维护人员确实承担了一定的责任,不会引入会破坏客户端代码的更改。
前几天我与同事进行了类似的谈话。 他正在使用Spring客户端,它需要使用一个接口来编译客户端,然后Spring注入实际代码以使接口工作。 它基本上归结为我们之间最古老的锯,像动态代理这样的东西通常会引入某种性能税,他没关系,我开始写生活中的设备驱动程序,所以我对速度有着极大的偏见。 就我而言,更快/更小的胜利,因为我不受限于这样有限的环境......我的Droid手机让我所有的系统,包括大型机,在我的前10年专业看起来微不足道,我会站在速度的一边。 对此的共同反驳是,还有许多其他瓶颈是“真正的”问题,而且这个问题对他们来说微不足道......而且可能是真的......但每一点点都有帮助。 如果你读过Steve Souders和他的同胞们的东西......用户可以注意到400毫秒的变化......他们并不一定注意到事情变慢了,但他们的反应是不同的。 因为我无法对网络速度,数据库索引开销等做任何事情,所以我至少可以用我可以影响的事情做最好的工作。 呼! 对不起'那个!! 现在就离开肥皂盒吧! ;)
DII(d ynamic 我 nvocation 我覆盖整个院落)客户端:随着DII,客户可以调用即使远程程序或服务的名称的签名是未知的,直到运行时的远程过程。
由于其灵活性,可以在服务代理中使用DII客户端,该服务代理动态地发现服务,配置远程调用并执行调用。
好处
缺点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.