springBoot项目使用webservice客户端调用报错:service tracker has not been initialized

本文详细解析了在使用SpringBoot环境下,遇到的Webservice客户端初始化错误“servicetrackerhasnotbeen initialized”。通过分析发现,问题源于CXF客户端生成过程中替换线程类装载器导致的JSF上下文信息丢失。文章提供了具体解决方案,即在调用CXF前后保存并恢复当前线程的类装载器,确保线程上下文的一致性。

        最近在使用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;
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值