0

サード パーティの .Net Web サービスとのインターフェイスに JAXWS メトロ クライアントを使用しています。Web サービスで状態を維持する必要があります。というわけで、シナリオはこちら。.Net Web サービスを呼び出すメトロ クライアントを呼び出すユーザー アプリケーションがいくつかあります。

wsimport ツールを実行し、必要なクラスを生成しました。ただ、状態を維持しなければならないので、サービスクラスのオブジェクトプールを実装しようと考えています。このように、各ユーザー アプリは常に、それが使用している特定のサービス オブジェクトに関連付けられます。したがって、フローは次のようになります。

COSServiceImpl -> COSServiceFactory は、COSService (プールされる wsimport によって生成されたサービス クラス) -> .Net Web サービスをインスタンス化/維持します。

ということで、実装は以下の通り。誰にもより良い提案がありますか?考え?

UserApp.java

COSServiceImpl impl = new COSServiceImpl();
ClaimantAccount claimantAccount = impl.getClaimantAccount(String claimantID)

COSServiceImpl.java

public ClaimantAccount getClaimantAccount(String claimantID) {
ICOSService port = COSServiceFactory.getCOSServicePort();
ClaimantInfo info = port.retrieveClaimantInfo(claimantID);
ClaimantAccount account = new ClaimantAccount();
account.setXXX(info.getXXX);
return account;
}

COSServiceFactory.java

public class COSServiceFactory extends BasePoolableObjectFactory<COSService> {

private static GenericObjectPool<COSService> servicePool = null;

static {
try { 
init();
} catch(Exception e) {
throw new ExceptionInInitializerError(e);
}
}

public static void init() {
servicePool = new GenericObjectPool<COSService>(new COSServiceFactory());
for (int i=0; i < poolSize; i++) {
servicePool.addObject();
}

public COSService makeObject() throws Exception {
URL wsdlURL = null;
service = new COSService(wsdlURL, new QName(nameSpace,localPart) );
return service;
}

private static COSService getCOSService() {
    COSService service = null;
    try {
        service = (COSService) servicePool.borrowObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return service;
    }

 public static ICOSService getWebServicePort() {
    ICOSService port = getCOSService().getWSHttpBindingICOSService();
    BindingProvider bindingProvider = (BindingProvider) port;
// Is there any other place to set the request timeout, may be a handler???
    bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", Config.getIntProperty("request.timeout")); 
    return port;
    }

また、リクエストのタイムアウトを設定できる場所は他にありますか? このままでいいの?上記のコードでは、ポート オブジェクトを変更しているとは思いません。まだテストしていませんが、リクエストのタイムアウト プロパティは機能しますか?

コメントありがとうございます。

ビジェイ・ガナパシー

4

1 に答える 1

0

それが誰かを助けるなら、ここに私の理解があります:

可能ですが、Service インスタンスをプールする必要はありません。私のテストに基づいて、それはうまく機能しているようです。サービス オブジェクトをプールする必要がない理由は、サービス クラスの Service.getPort() メソッドを呼び出して ICOSService Web サービス ポート オブジェクトを作成するときに、getPort() メソッドが毎回新しい ICOSService オブジェクトを返すためです。 java.lang.reflect.Proxy の newProxyInstance メソッド。

于 2012-11-13T23:02:18.780 に答える