使用带有JAX-WS的动态客户端的优点

时间:2009-11-13 17:29:21

标签: java web-services jax-ws cxf

与仅使用生成的客户端类相比,使用带有JAX-WS服务的动态客户端有什么好处?有什么缺点?

**对于我的特殊情况,我使用的是Apache CXF,我不确定其他库是否允许“动态”客户端。

- 我认为我不需要添加它,但是......我正在寻找非显而易见的(我知道......主观的)优点。我不需要别人告诉我不使用生成的类的优点是我不需要生成类。

6 个答案:

答案 0 :(得分:7)

嗯,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]);

关于缺点,它们非常明显(这是付出的代价):你正在操纵字符串,你失去了强烈的打字。

答案 1 :(得分:2)

优点是避免生成和包含代码。在某些环境中,这是一个问题。如果您的环境中没有包含生成代码的障碍,那么动态客户端是一个坏主意,速度更慢,更麻烦。

动态客户端速度较慢,因为代码(我写了一些代码)必须:

  1. 解析wsdl和schema
  2. 生成代码
  3. 编译代码
  4. 它更麻烦,因为您的数据模型中没有任何复杂对象的bean类。你需要使用反射。

    请记住,动态客户端与调用接口不同。

答案 2 :(得分:1)

使用动态客户端的优点是您不需要在运行时之前生成存根。这允许您通常在运行时调用您可能不知道的服务。

答案 3 :(得分:1)

如果您准确了解客户端代码将要调用的Web服务以及在客户端的生命周期内不会发生更改,则生成的客户端类很棒。

如果其中任何一种情况不是这样,那么您需要考虑客户如何处理这些情况。 Dispatch API使您可以灵活地动态生成Web服务调用,而无需熟悉所访问的服务。 这显然需要代码来支持构建该调用所需的配置选项。

总而言之,服务器端接口的开发人员/维护人员承担了一定的责任,不会引入会破坏客户端代码的更改。

答案 4 :(得分:1)

前几天我与同事进行了类似的谈话。他正在使用Spring客户端,它需要使用一个接口来编译客户端,然后Spring注入实际代码以使接口工作。它基本上归结为我们之间最古老的锯,像动态代理这样的东西通常会引入某种性能税,他没关系,我开始写生活中的设备驱动程序,所以我对速度有着极大的偏见。就我而言,更快/更小的胜利,因为我不受限于这种有限的环境......我的Droid手机让我所有的系统工作,包括大型机,在我的前10年专业看起来微不足道,我会站在速度的一边。对此的共同反驳是,还有许多其他瓶颈是“真正的”问题,而且这个问题对他们来说微不足道......而且可能是真的......但每一点点都有帮助。如果你从Steve Souders和他的同胞那里读到的东西......用户可以注意到短至400毫秒的变化......他们并不一定注意到事情变慢了,但他们的反应是不同的。因为我无法对网络速度,数据库索引开销等做任何事情,所以我至少可以用我可以影响的事情做最好的工作。 呼!对不起'那个!!现在就离开肥皂盒吧! ;)

答案 5 :(得分:1)

DII(Dynamic Invocation Interface) Client:使用DII,即使远程过程的签名或服务名称在运行时未知,客户端也可以调用远程过程。

由于其灵活性,可以在服务代理中使用DII客户端,以动态发现服务,配置远程调用并执行调用。

  • <强>优点

    • 这里我们要创建简单的java接口,描述Web服务支持访问的操作。因此,不需要自动生成的存根来访问服务。
    • 使用端点,即可在运行时即时生成WSDL和Stub。
  • 缺点

    • 即使是这种风格,我们也必须在创建客户端之前了解Web服务。
    • Generated Stub(GS)相比,由于WSDL和存根在运行时生成,因此工作缓慢。