我有 JAX-WS 样式的 Web 服务客户端,它是使用 NetBeans IDE 自动生成的。
生成的代理工厂(扩展 javax.xml.ws.Service)将代理创建委托(delegate)给各种 Service.getPort 方法。我正在维护的应用程序实例化工厂并在每次调用目标服务时获取代理。
重复创建新的代理工厂实例已被证明是昂贵的,因为提供给工厂构造函数的 WSDL 文档,一个 HTTP URI,是为每个实例重新检索的。
我们通过缓存 WSDL 成功地提高了性能。但这对我们有不好的维护和包装影响。
我想探讨缓存代理工厂本身的适用性。它是否安全,例如,在同一个 JVM 上执行并针对同一个 Web 服务的两个不同的客户端类是否可以安全地使用同一个工厂来获取不同的代理对象(或共享的、可重入的代理对象)?
我一直无法从 JAX-WS 规范或 javax.xml.ws API 文档中找到指导。我不清楚工厂代理的多样性。使用 Service.getPort 而不是 Service.createPort 不会激发信心。
最佳答案
您可以在几分之一秒内连接 10000 个端口,因此存储服务是个好主意。 也可以将 wsdl 存储在本地并稍后更改端点。
示例 peopleWsdl 和 peopleEndpoint:
文件:/C:/Users/richard/Workspaces/OSB/SyllabusMailing/war/WEB-INF/wsdl/people/People_2_0.wsdl
http://myserver:8011/domain/sem/People_2_0?wsdl
private static DSSeMPeople service = null;
private DsSemPeoplePort getPort() throws Exception
{
String wsdl = AppUtil.getWebXmlParameter( "peopleWsdl" );
String endpoint = AppUtil.getWebXmlParameter( "peopleEndpoint" );
if( wsdl==null || "".equals(wsdl) ) {
wsdl = endpoint;
}
try {
if( service==null ) {
log.info( "create peopleService from wsdl: " + wsdl );
log.info( "use peopleService endpoint: " + (endpoint==null?"(from wsdl)":endpoint) );
URL url = new URL( wsdl );
service = new DSSeMPeople( url, new QName( "http://www.tudelft.nl/domain/sem/people_2_0/", "DS_SeM_People") );
}
DsSemPeoplePort port = service.getDsSemPeoplePort();
// set endpoint
if( endpoint!=null && !"".equals(endpoint) && !endpoint.equals(wsdl) ) {
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint );
}
return port;
} catch (Exception e) {
String msg = "Failed to connect to people webservice. ";
log.error( msg );
throw new Exception( msg, e );
}
}
关于java - 重用 javax.xml.ws.Service 对象安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465928/