与仅使用生成的客户端类相比,将动态客户端与 JAX-WS 服务一起使用有哪些优势?有什么缺点?
**对于我使用 Apache CXF 的特殊情况,我不确定哪些其他库允许“动态”客户端。
- 我以为我不需要添加这个,但是......我正在寻找不明显(我知道......主观)的优势。我不需要其他人告诉我不使用生成的类的好处是我不需要生成类。
与仅使用生成的客户端类相比,将动态客户端与 JAX-WS 服务一起使用有哪些优势?有什么缺点?
**对于我使用 Apache CXF 的特殊情况,我不确定哪些其他库允许“动态”客户端。
- 我以为我不需要添加这个,但是......我正在寻找不明显(我知道......主观)的优势。我不需要其他人告诉我不使用生成的类的好处是我不需要生成类。
好吧,CXF 文档非常清楚Dynamic Clients的优点:
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(动态调用接口)客户端:使用DII ,客户端可以调用远程过程,即使远程过程的签名或服务的名称在运行时之前是未知的。
由于其灵活性,DII 客户端可用于动态发现服务、配置远程调用和执行调用的服务代理。
优点
缺点