通过SpringBoot-RestTemplate方式调用

1.RestTemplate工具类

package com.singhand.companyadressredis.main.config;import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.client.RestTemplate;import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;@Configuration
public class RestTemplateConfig {@AutowiredCloseableHttpClient httpClient;@Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());return restTemplate;}@Beanpublic HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();clientHttpRequestFactory.setHttpClient(httpClient);return clientHttpRequestFactory;}
}

上面是通过设置httpClient,我们也可以直接

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setConnectTimeout(15000);factory.setReadTimeout(5000);return factory;}
}

如果通过httpClient,需要加入httpClient配置,如下

2.httpClient

package com.singhand.companyadressredis.main.config;import com.singhand.sysdev.utils.log4wk.KLog;
import com.singhand.sysdev.utils.tools.ExceptionUtils;
import org.apache.http.HeaderElement;
import org.apache.http.HeaderElementIterator;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeaderElementIterator;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;/*** - Supports both HTTP and HTTPS* - Uses a connection pool to re-use connections and save overhead of creating connections.* - Has a custom connection keep-alive strategy (to apply a default keep-alive if one isn't specified)* - Starts an idle connection monitor to continuously clean up stale connections.*/
@Configuration
@EnableScheduling
public class HttpClientConfig {/** Determines the timeout in milliseconds until a connection is established* */private static final int CONNECT_TIMEOUT = 30000;/** The timeout when requesting a connection from the connection manager*/private static final int REQUEST_TIMEOUT = 30000;/** The timeout for waiting for data*/private static final int SOCKET_TIMEOUT = 60000;private static final int MAX_TOTAL_CONNECTIONS = 50;private static final int DEFAULT_KEEP_ALIVE_TIME_MILLIS = 20 * 1000;private static final int CLOSE_IDLE_CONNECTION_WAIT_TIME_SECS = 30;@Beanpublic PoolingHttpClientConnectionManager poolingConnectionManager() {SSLContextBuilder builder = new SSLContextBuilder();try {builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());} catch (NoSuchAlgorithmException | KeyStoreException e) {KLog.error("poolingConnectionManager Exception","Pooling Connection Manager Initialisation failure because of " + ExceptionUtils.errInfo(e));}SSLConnectionSocketFactory sslsf = null;try {sslsf = new SSLConnectionSocketFactory(builder.build());} catch (KeyManagementException | NoSuchAlgorithmException e) {KLog.error("poolingConnectionManager Exception","Pooling Connection Manager Initialisation failure because of " + ExceptionUtils.errInfo(e));}Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);poolingConnectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS);return poolingConnectionManager;}@Beanpublic ConnectionKeepAliveStrategy connectionKeepAliveStrategy() {return new ConnectionKeepAliveStrategy() {@Overridepublic long getKeepAliveDuration(HttpResponse response, HttpContext context) {HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));while (it.hasNext()) {HeaderElement he = it.nextElement();String param = he.getName();String value = he.getValue();if (value != null && param.equalsIgnoreCase("timeout")) {return Long.parseLong(value) * 1000;}}return DEFAULT_KEEP_ALIVE_TIME_MILLIS;}};}@Beanpublic CloseableHttpClient httpClient() {RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(REQUEST_TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();return HttpClients.custom().setDefaultRequestConfig(requestConfig).setConnectionManager(poolingConnectionManager()).setKeepAliveStrategy(connectionKeepAliveStrategy()).build();}}

3.接下来t通过CompletableFuture异步调用接口


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;@Component
public class ReptileUtils {@AutowiredRestTemplate restTemplate;public void sendReptile(String keyword){
//CompletableFuture实现异步调用CompletableFuture future = CompletableFuture.supplyAsync(() -> {
//你自己的逻辑代码,通过restTemplate.exchange调用外部接口HttpHeaders header = new HttpHeaders();header.setContentType(MediaType.APPLICATION_JSON);List<ReptileInput> params= new ArrayList<>();HttpEntity<Object> requestEntity = new HttpEntity<>(params, header);ResponseEntity<Object> response = restTemplate.exchange(url, HttpMethod.POST,requestEntity,Object.class);return response;}).thenAccept(e->System.out.println(e));//thenAccept接口完成处理结果}
}

java异步调用外部接口相关推荐

  1. java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?

    你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1.利用Spring的异步方法去执行 注:没有返回值 在启动类又或者是配置类加 ...

  2. Java异步调用的几种方式

    一.通过创建新线程 二.通过线程池 三.通过@Async注解 四.通过CompletableFuture 日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结 ...

  3. java 异步调用 事务_深入理解Spring注解@Async解决异步调用问题

    序言:Spring中@Async 根据Spring的文档说明,默认采用的是单线程的模式的.所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的. 那么当多个任务的执行势必会相互影响. ...

  4. Java 异步调用实践

    本文要点: 为什么需要异步调用 CompletableFuture 基本使用 RPC 异步调用 HTTP 异步调用 编排 CompletableFuture 提高吞吐量 为什么异步 BIO 模型 首先 ...

  5. java 异步调用接口_Java接口异步调用

    java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调:同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行.今天来说说异步调用. 什么是异步调用? 我 ...

  6. java异步调用数据库存储过程详解,java中如何调用存储过程

    create procedure getsum @n int =0 as declare @sum int declare @i int set @sum=0 set @i=0 while @i 在线 ...

  7. java异步调用微信接口_微信支付V3 SDK(Java版,支持同步异步调用)

    我们在开发微信支付时,发现微信官方已经对SDK做了升级,V3版本的SDK从设计上符合RESTful规范. 我们再在开源库中寻找是否有现成de开箱即用.并且支持响应式编程的SDK版本.经过一凡寻找,令我 ...

  8. java 异步调用webapi_Async Await异步调用WebApi

    先铺垫一些基础知识 在 .net 4.5中出现了 Async Await关键字,配合之前版本的Task 来使得开发异步程序更为简单易控.   在使用它们之前 我们先关心下 为什么要使用它们.好比 一个 ...

  9. java 异步调用 事务_@Transactional事务提交后触发异步方法

    一.问题复现 1.场景 2个service方法, 方法A中调用方法B. 方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollba ...

最新文章

  1. 设置RabbitMQ远程ip登录
  2. 模拟spring IOC、源码分析
  3. Leet Code OJ 283. Move Zeroes [Difficulty: Easy]
  4. springboot + kafka
  5. 时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换
  6. 多线程:实现Callable接口
  7. 减少浏览器兼容性问题
  8. 转: SMTP 服务器无法识别在 Mac 2011 Outlook 中发送电子邮件时错误。错误 17092...
  9. linux 网卡驱动 优化,Linux多核环境网卡驱动优化研究①.PDF
  10. php apache 配置后不能正常显示html文件的解决方法
  11. ubuntu下/etc/rc.local和/etc/init.d/rc.local的区别
  12. HDU - 2196(树形DP)
  13. HttpModule和HttpHandler的常见用法
  14. 构建词表与抽样——【torch学习笔记】
  15. armv6, armv7, armv7s, arm64 的区别
  16. paxos算法java实现_Paxos算法——前世
  17. der解码规则_DER 编码规范理解
  18. 服务器网站中断,如何解决无法打开网页及服务器已断开连接的问题?
  19. 天呐。怎么修改上传资源积分的?
  20. 烤仔TVのCCW丨存储押金代付

热门文章

  1. matlab图像增强实验总结,MatLab图像增强实验
  2. 微信小程序实现抽奖大轮盘
  3. 【PyTorch】PyTorch基础知识——自动求导
  4. win10安装redis及基本操作
  5. 信息熵、条件熵、信息增益
  6. python scrapy 环境搭建_Python Scrapy 爬虫(一):环境搭建
  7. 使用VLC开源库开发播放器
  8. ie浏览器自带小眼睛是什么用的_如何取消禁用IE10密码输入框中的小眼睛功能
  9. 使用Python播放mp3格式音频
  10. 再谈Delphi 10.4.2 FMX应用程序事件TApplicationEvent