RestTemplate SSL证书信任忽略 + 线程池配置 + 线程池监控

RestTemplateConfig.java

RestTemplate配置类

@Slf4j
@Configuration
public class RestTemplateConfig {

    /**
     * 初始化 RestTemplate 配置线程池和SSH证书信任
     */
    @Bean
    public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {

        SSLContext sslContext = SSLContextBuilder.create().
                loadTrustMaterial((chain, authType) -> true).build();
        // 创建 SSL 连接工厂
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext);
        // 注册连接工厂
        Registry<ConnectionSocketFactory> socketFactoryRegistry =
                RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("https", sslSocketFactory)
                        .register("http", PlainConnectionSocketFactory.getSocketFactory())
                        .build();
        // 创建连接池管理器
        PoolingHttpClientConnectionManager connectionManager =
                new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        // 设置最大连接数
        connectionManager.setMaxTotal(restTemplateProperties.getMaxTotalConnections());
        // 设置每个路由的最大连接数
        connectionManager.setDefaultMaxPerRoute(restTemplateProperties.getDefaultMaxPerRoute());

        // 创建 HttpClient 实例并设置连接池
        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .setSSLContext(sslContext)
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();
        PoolStats totalStats = connectionManager.getTotalStats();
        log.info("自定义线程池初始化:maxTotal: {} ,DefaultMaxPerRoute: {} ,totalStats: {}",
                connectionManager.getMaxTotal(), connectionManager.getDefaultMaxPerRoute(),
                totalStats.toString());
        IdleConnectionMonitor thread = new IdleConnectionMonitor(connectionManager);
        thread.start();
        // 创建 HttpComponentsClientHttpRequestFactory 实例,并设置连接超时和读取超时
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        // 连接超时时间
        requestFactory.setConnectTimeout(restTemplateProperties.getConnectTimeout());
        // 读取超时时间
        requestFactory.setReadTimeout(restTemplateProperties.getReadTimeout());
        requestFactory.setConnectionRequestTimeout(restTemplateProperties.getConnectTimeout());

        // 创建 RestTemplate 实例并设置 requestFactory
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.setInterceptors(Collections.singletonList(new RestTemplateLogInterceptor()));
        //提供对传出/传入流的缓冲,可以让响应body多次读取(如果不配置,拦截器读取了Response流,再响应数据时会返回body=null)
        restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(requestFactory));
        return restTemplate;
    }

}

RestTemplateProperties.java

线程池参数配置类

@Data
@Configuration
@ConfigurationProperties(prefix = "XXXX")
public class RestTemplateProperties {

    /**
     * 连接超时时间
     */
    private int connectTimeout;
    /**
     * 读取超时时间
     */
    private int readTimeout;
    /**
     * 设置最大连接数
     */
    private int maxTotalConnections;
    /**
     * 设置每个路由的最大连接数
     */
    private int defaultMaxPerRoute;
}

IdleConnectionMonitor.java

线程池使用情况监控


/**
 * 连接池使用情况监控
 */
@Slf4j
public class IdleConnectionMonitor extends Thread {
    public static final int WAIT_TIME = 5000;
    private HttpClientConnectionManager connMgr;
    private volatile boolean shutdown;

    public IdleConnectionMonitor(PoolingHttpClientConnectionManager connMgr) {
        super();
        this.connMgr = connMgr;
    }

    @Override
    public void run() {
        try {
            while (!shutdown) {
                synchronized (this) {
                    wait(WAIT_TIME);
                    PoolStats totalStats = ((PoolingHttpClientConnectionManager) connMgr).getTotalStats();
                    log.info("monitor total pool stat: {}", totalStats);
                    Set<HttpRoute> routes = ((PoolingHttpClientConnectionManager) connMgr).getRoutes();
                    for (HttpRoute route : routes) {
                        PoolStats stats = ((PoolingHttpClientConnectionManager) connMgr).getStats(route);
                        log.info("monitor route url {}, current pool stat: {}", route.getTargetHost(), stats);
                    }
                }
            }
        } catch (InterruptedException ex) {
            log.error("连接池使用监控 error", ex);
            shutdown();
            Thread.currentThread().interrupt();
        }
    }

    public void shutdown() {
        shutdown = true;
        synchronized (this) {
            notifyAll();
        }
    }
}

技术书籍公众号内回复[ pdf ] Get。

面试笔记、springcloud进阶实战PDF,公众号内回复[ 1222 ] Get。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握计算机自动化:Pyperclip与CnOCR详细教程(最全使用方法,每行代码都有注释,帮你解决与之有关的所有问题)

文章目录 一、Pyperclip概念二、Pyperclip基础语法三、Pyperclip与文件交互四、Pyperclip生成随机密码五、OCR概念六、CnOCR 基础识别七、CnOCR 不同图片识别 在这个信息化快速发展的时代&#xff0c;高效的信息处理变得尤为关键。Python&#xff0c;作为一门强大的编程语言&am…

【C语言】linux内核dev_queue_xmit

一、中文注释 这两个函数是Linux内核网络子系统中负责发起网络包&#xff08;sk_buff结构&#xff09;传输的代码。下面我将用中文对这两个函数做一个简单的注释&#xff1a; /*** __dev_queue_xmit - 发送一个buffer* skb: 要发送的buffer* sb_dev: 子设备&#xff0c;用于层…

2024年最新整理腾讯云学生服务器价格、续费和购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

Pytorch之神经网络最大池化层

池化层&#xff08;Pooling layer&#xff09;是深度学习神经网络中常用的一种层类型&#xff0c;它的作用是对输入数据进行降采样&#xff08;downsampling&#xff09;操作。池化层通过在输入数据的局部区域上进行聚合操作&#xff0c;将该区域的信息压缩成一个单一的值&…

面试题个人总结(面经)

自我介绍 你好&#xff0c;我叫XXX&#xff0c;是今天面试初级蓝队的人员&#xff0c;我毕业于XXXX&#xff0c;专业为网络空间安全,我曾经在XXXXX实习过&#xff0c;有过大概一年左右的工作经验&#xff0c;还有过一定的护网经验&#xff0c;去年在XXX厂商护过网&#xff0c;…

【计算机考研择校】四川大学vs电子科技大学哪个难度更大?

川大在文科&#xff0c;经管方面比科大强&#xff0c;医学在国内都很强。但工科方面特别是电子信息领域明显是科大强于川大。毕竟一个是综合大学&#xff0c;一个是工科大学不可同日而语。 就业上&#xff0c;电子科大在IT领域的社会声誉口碑不错。就业一向都很好。这个多问问…

Swin-UMamba—基于 Mamba 的 UNet 和基于 ImageNet 的预训练—论文精读和代码实践

Swin-UMamba 期刊分析摘要贡献方法Swin-UMamba整体框架1. 基于 Mamba 的 VSS 块2. 集成基于 ImageNet 的预训练3. Swin-UMamba解码器4. Swin-UMamba†&#xff1a;带有基于 Mamba 的解码器的 Swin-UMamba 实验代码实践 可借鉴参考 期刊分析 Swin-UMamba只是名字中含有swin&…

为什么不从独立服务器中转向云或其他方案呢?

传统的专用服务器&#xff0c;如香港服务器租赁、重庆服务器租赁等&#xff0c;是最强大、最稳定的业务托管类型之一。您将获得比任何其他托管计划更多的管理权限和卓越的性能&#xff0c;并且您可以控制整个服务器上的几乎所有内容。 当然&#xff0c;专用服务器也是在线业务…

HTML5:七天学会基础动画网页9

在进行接下来的了解之前我们先来看一下3d的xyz轴&#xff0c;下面图中中间的平面就相当于电脑屏幕&#xff0c;z轴上是一个近大远小的效果。 3d转换属性 transform 2D或3D转换 transform-origin 改变旋转点位置 transform-style 嵌套元素在3D空间如何显 …

Eclipse调试技巧 条件断点 监视

实验代码 import java.util.Scanner;public class Test {// 判断n是否为质数public static boolean isPrime(int n){if (n < 2)return false;for (int i 2; i < n; i){if (n % i 0)return false;}return true;}public static void main(String[] args){Scanner scanne…

类初步认识与对象

一&#xff0c;对于面向对象的认识 Java是一门面向对象的语言&#xff0c;一切都可以称为对象。将一个大象装进冰箱&#xff0c;甭管步骤多复杂&#xff0c;大象便是对象&#xff1b;将牛奶放进冰箱&#xff0c;牛奶便是对象&#xff1b;你我均是对像。 再比如洗一个衣服&…

JavaScript——流程控制(程序结构)

JavaScript——流程控制&#xff08;程序结构&#xff09; 流程控制就是来控制我们的代码按照什么结构顺序来执行。更倾向于一种思想结构。 流程控制分为三大结构&#xff1a;顺序结构、分支结构、循环结构 1、顺序结构 ​ 代码从上往下依次执行&#xff0c;从A到B执行&#x…

Java毕业设计 基于SpringBoot vue 疫苗咨询与预约系统

Java毕业设计 基于SpringBoot vue 疫苗咨询与预约系统 SpringBoot vue 疫苗咨询与预约系统 功能介绍 用户前端&#xff1a;首页 图片轮播 疫苗信息 条件查询 疫苗详情 点我收藏 评论 接种疫苗 疫情资讯 资讯详情 资讯评论 论坛交流 发布帖子 公告信息 公告详情 留言反馈 登录…

arm架构服务器使用Virtual Machine Manager安装的kylin v10虚拟机

本文中使用Virtual Machine Manager安装kylin v10的虚拟机 新建虚拟机 新建虚拟机 选择镜像&#xff0c;下一步 设置内存和CPU&#xff0c;下一步 选择或创建自定义存储&#xff08;默认存储位置的磁盘空间可能不够用&#xff09; 点击管理&#xff0c;打开选择存储卷页…

[linux]shell脚本语言:变量、测试、控制语句以及函数的全面详解

一、shell的概述 1、shell本质是脚本文件&#xff1a;完成批处理。 shell脚本是一种脚本语言&#xff0c;我们只需使用任意文本编辑器&#xff0c;按照语法编写相应程序&#xff0c;增加可执行权限&#xff0c;即可在安装shell命令解释器的环境下执行。shell 脚本主要用于帮助开…

【软件测试】如何申请专利?

一、专利类型 在软件测试领域&#xff0c;可以申请发明专利、实用新型专利和外观设计专利。其中&#xff0c;发明专利是最常见的专利类型&#xff0c;它保护的是软件测试方法、系统和装置等技术方案。 二、申请专利的条件 申请专利需要满足新颖性、创造性和实用性三个条件。…

饮料换购 刷题笔记

直接开个计数器mask 每当饮料现存数-1&#xff1b; cnt;且mask; 一旦mask达到3 饮料现存数 计数器清零3 代码 #include <iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int main(){ int n; …

【AIGC】如何提高Prompt准确度

前言 随着人工智能的迅猛进展&#xff0c;AIGC&#xff08;通用人工智能聊天工具&#xff09;已成为多个行业中不可或缺的自然语言处理技术。Prompt作为AIGC系统的一项关键功能&#xff0c;在工具的有效运作中发挥了举足轻重的作用。本篇文章将深入探讨Prompt与AIGC之间的紧密…

迭代器失效问题(C++)

迭代器失效就是迭代器指向的位置已经不是原来的含义了&#xff0c;或者是指向的位置是非法的。以下是失效的几种情况&#xff1a; 删除元素&#xff1a; 此处发生了迭代器的失效&#xff0c;因为erase返回的是下一个元素的位置的迭代器&#xff0c;所以在删除1这个元素的时候&…

SAP Parallel Accounting(平行分类账业务)配置及操作手册(超详细的说明和测试)

SAP Parallel Accounting(平行分类账业务)配置及操作手册 1、Overview 为了适应不同的会计准则&#xff0c;SAP在新总账中启用了多分类账&#xff0c;&#xff08;其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。&#xff09;分类账可以对应一…