1 非常经典的初始化resttemplate的方法
通过配置加上 条件注解实现,实现功能有设置超时参数,修改传递编码,添加拦截器等
@Configuration
@ConditionalOnClass(value = {RestTemplate.class, HttpClient.class})
public class RestTemplateConfiguration {
@Value("${remote.maxTotalConnect:0}")
private int maxTotalConnect; //连接池的最大连接数默认为0
@Value("${remote.maxConnectPerRoute:200}")
private int maxConnectPerRoute; //单个主机的最大连接数
@Value("${remote.connectTimeout:2000}")
private int connectTimeout; //连接超时默认2s
@Value("${remote.readTimeout:30000}")
private int readTimeout; //读取超时默认30s
//创建HTTP客户端工厂
private ClientHttpRequestFactory createFactory() {
if (this.maxTotalConnect <= 0) {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(this.connectTimeout);
factory.setReadTimeout(this.readTimeout);
return factory;
}
HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect)
.setMaxConnPerRoute(this.maxConnectPerRoute).build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
httpClient);
factory.setConnectTimeout(this.connectTimeout);
factory.setReadTimeout(this.readTimeout);
return factory;
}
//初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理
@Bean
@ConditionalOnMissingBean(RestTemplate.class)
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate(this.createFactory());
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
//重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题
HttpMessageConverter<?> converterTarget = null;
for (HttpMessageConverter<?> item : converterList) {
if (StringHttpMessageConverter.class == item.getClass()) {
converterTarget = item;
break;
}
}
if (null != converterTarget) {
converterList.remove(converterTarget);
}
converterList.add(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
//加入FastJson转换器 根据使用情况进行操作,此段注释,默认使用jackson
//converterList.add(new FastJsonHttpMessageConverter4());
return restTemplate;
}
private void checkAuthHeaderExist(){
List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
boolean hasBasicAuth = false;
for (int i = 0; i < interceptors.size(); i++) {
if (interceptors.get(i) instanceof BasicAuthorizationInterceptor) {
hasBasicAuth =true;
}
}
if(!hasBasicAuth){
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(username,password));
}
}
2 Spring 异步编程
主要用到了两个注解 @EnableAsync用在配置上 @Async(用在 servicer主类方法里)
步骤有3步骤
a:
@Configure //等价于 spring.xml里面的 配置
@EnableAsnyn
@ComponentScna(‘com.abc’)//等价于spring.xml里面的包扫描
Configure类
b @Service
class MyService{
@Async
a(){}
@Async
b(){}
}
3 主测试类
myService.a();b();运行发现ab打印内容循环展示