使用队列解决高并发下使用Client对象调用webService接口

导读:本篇文章讲解 使用队列解决高并发下使用Client对象调用webService接口,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

解释:在高并发情况下,重复的创建Client对象会大量占用内存,并且开销昂贵,将其保存到队列当中,避免重复创建对象;调用Client的时候先从队列中取,如果有则使用队列中的Client,如果没有则创建,最后都还将client对象重新放入队列供下次使用。
注:同一客户端同一时刻只能被一个线程消费,否则可能会因争用导致莫名其妙的错误,所以阻塞队列。
代码示例:

/**
 * 获取Client工具类--使用队列存放client防止并发
 * @author : jiagang
 * @date : Created in 2022/3/7 10:30
 */
public class ClientUtil {

    private static final BlockingQueue<Client> blockingQueue = new LinkedBlockingQueue<>(50);


    public static Client getClient() throws InterruptedException {

        Client client = blockingQueue.poll();

        if(client == null){

            JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();

            client = clientFactory.createClient("http://xxx/xxx/xxx?wsdl");

        }

        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy policy = new HTTPClientPolicy();
        policy.setConnectionTimeout(5000);
        policy.setAllowChunking(false);
        policy.setReceiveTimeout(5000);
        conduit.setClient(policy);

        // 用完之后将client再放入队列中
        // blockingQueue.put(client); //队列满了会阻塞
        blockingQueue.offer(client);
        return client;

    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/99538.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!