DAYU数据准备的底层小细节:一个简单的异步请求的实现

举报
Vking 发表于 2020/06/05 21:01:50 2020/06/05
【摘要】 JAVA实现一个简单的异步请求

        在DAYU数据开发的ETL算子中,有数据准备这个功能。数据准备是指从数据源获取一部分样例数据(默认100条),展示出来提供给用户操作。用户可以使用一系列的指令来对数据进行加工操作,加工后的目标数据,会通过ETL算子加载到目标端。下图为数据准备的页面:

image.png

        

        在获取样例数据的时候,对于DLI的大表,或者OBS的大文件,获取样例数据有超时的风险,所以之前就考虑设计一个异步的方案来获取数据。

        这个异步方案需要完成两点:(1)异步获取数据,防止超时;(2)获取到的原始数据能够缓存在后台,当用户在界面上操作样例数据时,直接采用缓存,而不是再去获取一次样例数据。

        最终的实现使用map+线程池的方式,避免使用数据库的大工作量。核心代码逻辑如下:

if (execute) {
    String uuid = getuuid(user);
    convert2RowList = getTempRowData(uuid, dataId);
    if (convert2RowList == null) {
        convert2RowList = Waitting;
        tempSamplingData.put(uuid, new RowListAge(Waitting));
        executorService.submit(() -> {
            try {
                List<Row> rowList = getObsFileContent(tokenInfo, user, charsetName, 100);
                tempSamplingData.put(uuid, new RowListAge(rowList, new ArrayList<>(), dataId));
            } catch (Exception e) {
                LOGGER.error("get obs file error", e);
                tempSamplingData.put(uuid, new RowListAge(Error, e));
            }
        });
    }

    if (Error == convert2RowList) {
        RowListAge error = tempSamplingData.remove(uuid);
        if (error != null && error.e != null) {
            throw error.e;
        } else {
            throw new IdeException(ErrorCode.OBS_RESOURCE_INVALID_OBSPATH);
        }
    }
}


        (1)前台调用execute请求,后台去Map中查询数据,如果数据不存在,则提交获取数据的线程到线程池中,同时返回等待的标识符给前台;
        (2)获取数据的线程执行完后,把获取到的原始数据放到Map中;
        (3)如果捕获到异常信息,则把异常信息放到Map中;
        (4)前台轮询发送请求,直到有数据返回或有异常抛出或者整个请求耗时超过2分钟。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。