0

我们正在使用 JAXWS Metro 客户端与第 3 方 .Net Web 服务进行交互。我们需要维护 Web 服务的状态。所以,这就是场景。有几个用户应用程序会调用 Metro 客户端,而 Metro 客户端又会调用 .Net Web 服务。

我已经运行了 wsimport 工具并生成了必要的类。但既然我们必须维护状态,我正在考虑实现服务类的对象池。这样,每个用户应用程序总是与它正在使用的特定服务对象结合。因此,流程将是:

COSServiceImpl -> COSServiceFactory 实例化/维护 COSService(wsimport 生成的服务类将被池化) -> .Net Web 服务。

所以,实现如下。有人有更好的建议吗?想法?

用户应用程序.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.getPort() 方法来创建 ICOSService Web 服务端口对象时,getPort() 方法每次使用都会返回一个新的 ICOSService 对象java.lang.reflect.Proxy 的 newProxyInstance 方法。

于 2012-11-13T23:02:18.780 回答