【发布时间】: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() 上大约需要四分之一秒,即使这样也不太理想。而且我不知道......感觉就像我在引擎盖下热线而不是转动钥匙。 :)
【问题讨论】: