最近在使用webservice客户端时,发现项目一直在报一个“service tracker has not been initialized”的bug,分析原因:
1、springBoot不能使用自己手写的webservice客户端,必须使用cxf自动生成的客户端代码;
2、cxf客户端忘记关闭,加上finally{client.destory()}仍未解决;
3、最后定位到cxf在生成client时,替换了当前线程的类装载器,导致后面的jsf执行中,上下文信息的丢失
解决办法:在调用cxf之前获取当前线程的类装载器。调用完毕后,再放回,保证当前线程使用同一个类装载器。
问题解决。
附完整代码:
JaxWsDynamicClientFactory jaxWsDynamicClientFactory;
Client client = null;
try {
// 20190130:1、修改之前报服务跟踪器尚未初始化的异常。
// 2、原因:cxf在生成client时,替换了当前线程的类装载器,导致后面的jsf执行中,上下文信息的丢失
// 3、解决办法:在调用cxf之前获取当前线程的类装载器。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
jaxWsDynamicClientFactory = JaxWsDynamicClientFactory.newInstance();
client = jaxWsDynamicClientFactory.createClient(getWsdlUrl());
// 4、调用完毕后,再放回,保证当前线程使用同一个类装载器
Thread.currentThread().setContextClassLoader(classLoader);
// 设置客户端的配置信息,超时等.
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(10000); // 连接超时时间
policy.setReceiveTimeout(120000);// 请求超时时间.
httpConduit.setClient(policy);
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpConduit.setClient(httpClientPolicy);
} catch (Exception e) {
System.out.println("webservice获取客户端失败:" + e);
e.printStackTrace();
}
return client;
本文详细解析了在使用SpringBoot环境下,遇到的Webservice客户端初始化错误“servicetrackerhasnotbeen initialized”。通过分析发现,问题源于CXF客户端生成过程中替换线程类装载器导致的JSF上下文信息丢失。文章提供了具体解决方案,即在调用CXF前后保存并恢复当前线程的类装载器,确保线程上下文的一致性。
4059

被折叠的 条评论
为什么被折叠?



