我们正在使用JAXWS metro客户端与第三方.Net Web服务进行交互。我们需要使用Web服务维护状态。 所以,这是场景。有几个用户应用程序会调用metro客户端,后者又调用.Net Web服务。
我运行了wsimport工具并生成了必要的类。 但是既然,我们必须保持状态,我正在考虑实现服务类的对象池。 这样,每个用户应用程序始终与其正在使用的特定服务对象结合。 所以,流程将是:
COSServiceImpl - > COSServiceFactory实例化/维护COSService(将汇集的wsimport生成的服务类) - > .Net网络服务。
因此,实施如下。有谁有更好的建议?想法?
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;
}
此外,还有其他地方我们可以设置请求超时吗?可以这样做吗?使用上面的代码,我认为我们不会修改端口对象。我还没有测试过这个,但是请求超时属性会起作用吗?
感谢您的评论。
Vijay Ganapathy
答案 0 :(得分:0)
如果对任何人有帮助,这就是我的理解:
尽管我们可以,但我们不需要池化Service实例。根据我的测试,它似乎工作正常。 我们不需要池服务对象的原因是当我们调用服务类的Service.getPort()方法来创建ICOSService Web服务端口对象时,getPort()方法每次都使用以下命令返回一个新的ICOSService对象。 java.lang.reflect.Proxy的newProxyInstance方法。