Java 共用JAXWS wsimport服务对象-可能吗?

Java 共用JAXWS wsimport服务对象-可能吗?,java,web-services,jax-ws,object-pooling,Java,Web Services,Jax Ws,Object Pooling,我们正在使用JAXWS metro客户端与第三方.Net web服务进行接口。我们需要维护web服务的状态。 所以,这里是一个场景。有几个用户应用程序将调用metro客户端,metro客户端反过来调用.NETWeb服务 我已经运行了wsimport工具并生成了必要的类。 但是,既然我们必须维护状态,我想实现服务类的对象池。 这样,每个用户应用程序总是与其使用的特定服务对象相结合。 因此,流程将是: COSServiceImpl->COSServiceFactory实例化/维护COSService

我们正在使用JAXWS metro客户端与第三方.Net web服务进行接口。我们需要维护web服务的状态。 所以,这里是一个场景。有几个用户应用程序将调用metro客户端,metro客户端反过来调用.NETWeb服务

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

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

因此,实现如下。有谁有更好的建议吗?想法

UserApp.java

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

COSServiceFactory.java

公共类COSServiceFactory扩展了BasePoolableObjectFactory{
私有静态GenericObjectPool servicePool=null;
静止的{
试试{
init();
}捕获(例外e){
抛出新异常初始化错误(e);
}
}
公共静态void init(){
servicePool=新的GenericObjectPool(新的COSServiceFactory());
对于(int i=0;i
还有,还有其他地方可以设置请求超时吗?这样做可以吗?通过上面的代码,我认为我们没有修改端口对象。我还没有测试过这个,但是请求超时属性可以工作吗

感谢并感谢您的评论


Vijay Ganapathy

如果它对任何人都有帮助,以下是我的理解:

虽然可以,但我们不需要将服务实例集中在一起。根据我的测试,它似乎工作得很好。 我们不需要汇集服务对象的原因是,当我们调用服务类的service.getPort()方法来创建ICOSService web服务端口对象时,getPort()方法每次都会使用java.lang.reflect.Proxy的newProxyInstance方法返回一个新的ICOSService对象

public ClaimantAccount getClaimantAccount(String claimantID) {
ICOSService port = COSServiceFactory.getCOSServicePort();
ClaimantInfo info = port.retrieveClaimantInfo(claimantID);
ClaimantAccount account = new ClaimantAccount();
account.setXXX(info.getXXX);
return account;
}
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;
    }