【问题标题】:CXF client loads wsdl for both service and port?CXF 客户端为服务和端口加载 wsdl?
【发布时间】:2012-02-10 22:50:41
【问题描述】:

在 java web 应用程序中,我需要调用远程soap 服务,并且我正在尝试使用 CXF 2.5.0 生成的客户端。 SOAP 服务由特定的 ERP 供应商提供,它的 wsdl 非常庞大,有数千种类型,几十个 xsd 导入等。wsdl2java 生成客户端 ok,这要归功于 -autoNameResolution 标志。但在运行时,它会检索远程 wsdl 两次,一次是在我创建服务对象时,另一次是在我创建端口对象时。

MyService_Service myService = new MyService_Service(giantWsdlUrl);  // fetches giantWsdl
MyService myPort = myService.getMyServicePort();  // fetches giantWsdl again

这是为什么呢?我可以理解在创建 myService 时检索它,您想查看它是否与我当前使用的客户端匹配,或者让运行时 wsdl 位置指示端点地址等。但我不明白为什么请求端口会重新加载它只是的所有东西都在电线上。我错过了什么吗?

因为这是在一个 Web 应用程序中,而且我是 can't be sure that myPort is threadsafe,所以我必须为每个线程创建一个端口,除非这太慢了,多亏了可怕的 wsdl,需要 6 到 8 秒。或者添加我自己的池,提前创建一堆,然后进行签出和签入。呸。

为了记录,JaxWsProxyFactoryBean creation route 确实 获取 wsdl,这对我的情况有好处。第一次 create() 仍然需要很长时间,然后在随后的 create() 上大约需要四分之一秒,即使这样也不太理想。而且我不知道......感觉就像我在引擎盖下热线而不是转动钥匙。 :)

【问题讨论】:

    标签: wsdl cxf wsdl2java


    【解决方案1】:

    好吧,您实际上已经自己回答了这个问题。每次调用service.getPort() 时,都会从远程站点加载并解析 WSDL。 JaxWsProxyFactoryBean 完全一样,但是一旦获得代理,它就会被重新用于进一步的调用。这就是为什么第一次运行很慢(因为“热身”),但随后很快。

    是的,JaxWsProxyFactoryBean 不是线程安全的。池化客户端代理是一种选择,但不幸的是会消耗大量内存,如JAX-WS runtime model is not shared among client proxies;同步可能是更好的遵循方式。

    【讨论】:

    • 我希望了解的是为什么每次创建服务对象时每次创建端口对象时它都会获取wsdl。如果它是一个错误,如果它是我做的不对,等等。它会给我的设计带来真正的猴子扳手。并且使用 JaxWsProxyFactoryBean 永远不会获取远程 wsdl,我不会通过它,它也永远不会请求默认值。我给它的只是一个端点地址。
    • 奇怪。也许您创建服务的方式不是最佳的。试试下面的代码:MySEI sei = Service.getPort(MySEI.class);.
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2010-11-14
    • 2013-01-02
    相关资源
    最近更新 更多