多线程调用第三方接口
最近刚刚做完一个新项目,记录分享一个批量调用第三方接口方法。相信有很多朋友在项目中都遇到过需要批量调用第三方接口,所以今天在这里分享一下,写的不好就多多指教。
首先,简单的介绍一下需求,判断一个电话号码的归属地,需要返回它的省份和城市。
private List<String> getUpdateDataList(List<String> phoneList) {
// 创建线程池,这里创建了20个
ExecutorService executorService = Executors.newFixedThreadPool(20);
// 保存任务的返回结果
List<Future<String>> futureList = new ArrayList<>();
// 分配任务
for (String loopStr : phoneList) {
// 启动多线程返回号码的城市,有返回值使用submit(),并且多线程实现callable接口
Future<String> future = executorService
.submit(new UpdateCityThreadJob<String>(loopStr));
futureList.add(future);
}
// 关闭线程池
executorService.shutdown();
// 保存城市
List<String> collection = new ArrayList<>();
// 取出任务中的参数
for (Future<String> future : futureList) {
try {
// 取出任务中的结果
String city = future.get();
collection.add(city);
} catch (Exception e) {
throw new AppException(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
return collection;
}
// 创建任务类,因为有返回值,所以必须实现callable接口
public class UpdateCityThreadJob<V> implements Callable<String> {
// 电话号码
private String phoneNumber;
public UpdateCityThreadJob(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
/**
* @param phoneNumber 电话号码
* @return 城市
* @Description 获取 电话号码归属地邮政信息
*/
private String getCityRepeat(String phoneNumber) {
String city = "";
try {
city = getCity(phoneNumber);
} catch (Exception e) {
// 请求失败,重试五次,(防止网络原因导致请求失败)
for (int i = 0; i < 5; i++) {
try {
city = getCity(phoneNumber);
} catch (Exception e1) {
continue;
}
}
}
return city;
}
/**
*
* @Description 获取城市
* @param phoneNumber 电话号码
* @return 城市
* @throws Exception
*/
private String getCity(String phoneNumber) throws Exception {
// 请求第三方接口判断号码归属地
String result = HttpClient
.doGet("http://apis.juhe.cn/mobile/get?phone=" + phoneNumber + "&dtype=xml&key=" + Constants.API_KEY);
return result;
}
@Override
public String call() throws Exception {
synchronized (phoneNumber) {
// 获取城市
String city = getCityRepeat(phoneNumber);
return city;
}
}
}
调用第三放接口时,一般都会出现连接不稳定等等的异常,一般处理方式,都是重试几次即可。
代码是不是超级简单,只要思维清晰,什么问题都可以从容面对。。。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。