flink的异步接口调用

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flink 中使用异步多线程,可以通过 `AsyncFunction` 和 `AsyncIO` 来实现。 首先,你需要定义一个实现了 `AsyncFunction` 接口异步函数。这个函数将会在 Flink 中的一个独立线程池中执行。你需要在这个函数中编写异步的逻辑,例如调用一个远程服务或者进行 I/O 操作。这个函数需要实现以下方法: ```java public class MyAsyncFunction extends AsyncFunction<IN, OUT> { @Override public void asyncInvoke(IN input, ResultFuture<OUT> resultFuture) throws Exception { // 异步逻辑 // 将结果发送到 resultFuture 中 } @Override public void timeout(IN input, ResultFuture<OUT> resultFuture) throws Exception { // 超时处理逻辑 } } ``` 然后,你需要将这个异步函数作为输入传递给一个 Flink 的算子,例如 `map` 或者 `flatMap`。在这个算子中,你需要创建一个 `AsyncDataStream`,并且将异步函数传递给它: ```java DataStream<IN> input = ...; // 输入流 AsyncFunction<IN, OUT> myFunction = new MyAsyncFunction(); AsyncDataStream.orderedWait(input, myFunction, timeout, TimeUnit.MILLISECONDS, capacity); ``` `AsyncDataStream` 中的 `orderedWait` 方法将会并行地执行异步函数,并且保证输出的顺序和输入的顺序相同。`timeout` 参数指定了超时时间,如果异步函数的执行时间超过了这个时间,Flink 将会调用 `timeout` 方法进行超时处理。`capacity` 参数指定了异步函数执行的最大并行度。 通过这样的方式,你就可以在 Flink 中使用异步多线程了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值