我们正在使用 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;
}
另外,还有其他地方可以设置请求超时吗?这样做可以吗?使用上面的代码,我不认为我们正在修改端口对象。我还没有对此进行测试,但是请求超时属性会起作用吗?
感谢并感谢您的评论。
维杰·加纳帕蒂