解释:在高并发情况下,重复的创建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