サード パーティの .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;
}
また、リクエストのタイムアウトを設定できる場所は他にありますか? このままでいいの?上記のコードでは、ポート オブジェクトを変更しているとは思いません。まだテストしていませんが、リクエストのタイムアウト プロパティは機能しますか?
コメントありがとうございます。
ビジェイ・ガナパシー