同步接口的调用,是在接口响应之后,才能进行下一数据的请求方法,在接口性能不佳的情况下,严重影响flink的性能,这与flink的实时思想有违背,为了避免这种情况,我们在接口调用的时候,可以采取异步的方式。
不废话,直接上代码,需要原理自行官方文档。
AsyncDataStream.unorderedWait(dataSource, new HttpAsyncFunction("url"), 30000, TimeUnit.SECONDS, 20);
dataSource :调用接口的数据源
HttpAsynvFunction :博主的工具类,稍后分享给大家
30000: 请求的超时时间
TimeUnit.SECONDS:超时时间单位的描述
20: capacity:可以触发的异步I / O操作的最大数量
public class HttpAsyncFunction extends RichAsyncFunction<String, String> {
private static final long serialVersionUID = 8522411971886428444L;
private static final long TERMINATION_TIMEOUT = 5000L;
private static final int THREAD_POOL_SIZE = 10;
private String code;
static ExecutorService executorService;
static int counter = 0;
private static HashMap<String, String> configMap = GlobalConfigUtil.configMap;
public HttpAsyncFunction(String code) {
this.code = code;
}
@Override
public void open(Configuration parameters) throws Exception {
synchronized (HttpAsyncFunction.class) {
if (counter == 0) {
executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
}
++counter;
}
}
private void freeExecutor() {
synchronized (HttpAsyncFunction.class) {
--counter;
if (counter == 0) {
executorService.shutdown();
try {
if (!executorService.awaitTermination(TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException interrupted) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
}
@Override
public void close() throws Exception {
super.close();
freeExecutor();
}
@Override
public void asyncInvoke(String json, ResultFuture<String> resultFuture) throws Exception {
executorService.submit(new Runnable() {
@Override
public void run() {
String result = msgPush(json);
resultFuture.complete(Collections.singleton(result));
}
});
}
//接口的调用,对于里面的数据解析,根据自己的业务需求编码,工具类参考博主上篇博客
public String msgPush(String json) {
JSONObject rootObject = JSON.parseObject(json);
String requestData = rootObject.get("json").toString();
String code = rootObject.get("code").toString();
String phoneNum = rootObject.get("phoneNum").toString();
String province = rootObject.get("province").toString();
JSONObject jsonObject = new JSONObject();
jsonObject.put("interfaceSign",code);
jsonObject.put("phoneNum",phoneNum);
jsonObject.put("province",province);
jsonObject.put("responseTime",System.currentTimeMillis());
//调用接口
String url = "你自己的url";
String responseBody = DoPostUtil.doPost(requestData, url);
//数据的封装
try {
JSONObject responseJSON = JSON.parseObject(responseBody);
jsonObject.put("errMessage","成功");
jsonObject.put("responseBody",responseJSON);
return jsonObject.toString();
}catch (Exception e){
jsonObject.put("errMessage","成功");
jsonObject.put("responseBody","null");
return jsonObject.toString();
}
}
}
大家使用此代码,根据自己的业务需求修改msgPush方法即可.
来源:CSDN
作者:代码编制世界
链接:https://blog.csdn.net/qq_44962429/article/details/104307929