flink的异步接口调用

时光总嘲笑我的痴心妄想 提交于 2020-02-14 14:25:11

同步接口的调用,是在接口响应之后,才能进行下一数据的请求方法,在接口性能不佳的情况下,严重影响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方法即可.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!