Java Webアプリケーションでは、リモートソープサービスを呼び出す必要があり、CXF 2.5.0で生成されたクライアントを使用しようとしています。 SOAPサービスは特定のERPベンダーによって提供され、そのwsdlは怪物であり、何千ものタイプ、数十種類のxsdインポートなどです.wsdl2javaは、-autoNameResolutionフラグのおかげでクライアントを生成します。しかし、実行時にリモートwsdlを2回、つまりサービスオブジェクトを作成するときと、ポートオブジェクトを作成するときに2回ずつ取得します。CXFクライアントはサービスとポートの両方に対してwsdlをロードしますか?
MyService_Service myService = new MyService_Service(giantWsdlUrl); // fetches giantWsdl
MyService myPort = myService.getMyServicePort(); // fetches giantWsdl again
なぜですか?私はmyServiceを作成するときにそれを取得することを理解することができます、私は現在使用しているクライアントと一致するかを確認したい、またはランタイムwsdlの場所は、エンドポイントアドレスなどを指示させることができます。それはすべてただのために電線に出て行った。何か不足していますか?
これはWebアプリケーションにあり、I can't be sure that myPort is threadsafeなので、各スレッドのポートを作成する必要がありますが、それはあまりにも遅く、怪しいwsdlのおかげで6〜8秒です。または、私自身のプールを追加し、事前に束を作り、チェックアウトとチェックインを行います。ヤック
レコードの場合、JaxWsProxyFactoryBean creation routeはではありません。はこれまでにwsdlをフェッチしていますが、これは私の状況に適しています。最初のcreate()ではまだ長い時間がかかりますが、その後のcreate()では約4分の1秒です。そして、私は知りません...それは、鍵を回すのではなく、物事のホットワイヤーの下にいるように感じます。 :)
私が理解したいと思っていたのは、ポートオブジェクトが作成されるたびにサービスオブジェクトが作成されるたびに* wsdlがフェッチされる理由です。それがバグであれば、それは私が正しいことをしていないなど、それは私のデザインに本物のmonkeywrenchをスローします。また、JaxWsProxyFactoryBeanを使用してリモートwsdlをフェッチしないで、私はそれを渡さず、デフォルトを要求しません。私が与えるのは、エンドポイントアドレスだけです。 –
奇妙な。おそらくあなたのサービスを作成する方法は最適ではありません。次のコードを試してください: 'MySEI sei = Service.getPort(MySEI.class);'。 –