DAYU数据准备的底层小细节:一个简单的异步请求的实现
【摘要】 JAVA实现一个简单的异步请求
在DAYU数据开发的ETL算子中,有数据准备这个功能。数据准备是指从数据源获取一部分样例数据(默认100条),展示出来提供给用户操作。用户可以使用一系列的指令来对数据进行加工操作,加工后的目标数据,会通过ETL算子加载到目标端。下图为数据准备的页面:
在获取样例数据的时候,对于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)