当前位置: 首页 > news >正文

使用京东AsyncTool实现异步编排

 asyncTool: 解决任意的多线程并行、串行、阻塞、依赖、回调的并行框架,可以任意组合各线程的执行顺序,带全链路执行结果回调。多线程编排一站式解决方案。来自于京东主App后台。

/**
     * 批量更新用户(使用京东AsyncTool)
     *
     * @param idList
     */
    public void batchUpdateAsyncTool(List<Long> idList) {
        Boolean resultBoolean = processOrderAsyncTool(idList);
        if (resultBoolean) {
            System.out.println("所有都执行完毕");
        }
    }
@Transactional(rollbackFor = Exception.class)
    public Boolean processOrderAsyncTool(List<Long> idList) {
        List<WorkerWrapper> workerWrapperList = new ArrayList<>();
        for (int i = 0; i < idList.size(); i++) {
            UserServiceUpdateAsyncTool userServiceUpdateAsyncToolObject = new UserServiceUpdateAsyncTool();
            WorkerWrapper<Long, Boolean> workerWrapper = new WorkerWrapper.Builder<Long, Boolean>()
                    .id("wrapper" + idList.get(i))
                    .worker(userServiceUpdateAsyncToolObject)
                    .callback(userServiceUpdateAsyncToolObject)
                    .param(idList.get(i))//1+1
                    .build();
            workerWrapperList.add(workerWrapper);
        }
        try {
            //3个WorkerWrapper一起begin
            com.jd.platform.async.executor.Async.beginWork(1000, asyncExecutor, workerWrapperList);
        } catch (ExecutionException | InterruptedException e) {
            e.printStackTrace();
        }
        workerWrapperList.stream().forEach(workerWrapper -> {
            System.out.println("workResult:" + workerWrapper.getWorkResult());
            if ("EXCEPTION".equals(workerWrapper.getWorkResult().getResultState().name())) {
                if (workerWrapper.getWorkResult().getEx() instanceof BusinessException) {
                    throw new BusinessException(workerWrapper.getWorkResult().getEx().getMessage());
                } else {
                    throw new RuntimeException(workerWrapper.getWorkResult().getEx().getMessage());
                }
            }
        });
        return Boolean.TRUE;
    }
@Slf4j
@Service
public class UserServiceUpdateAsyncTool implements IWorker<Long, Boolean>, ICallback<Long, Boolean> {

    private UserService userService;


    @Transactional(rollbackFor = Exception.class)
    public Boolean funcAsyncTool(Long id) {
        System.out.println("lo开始=" + id);
        userService = ApplicationContextHolder.context.getBean(UserService.class);
//        try {
//            Thread.sleep(5000);
        User user = new User();
        user.setAge(Integer.valueOf(String.valueOf(Long.valueOf("30") + id)));
        if (id.equals(2L)) {
            throw new BusinessException("出现了2异常");
        }
        else if (id.equals(3L)) {
            throw new RuntimeException("出现了3异常");
        }
        }
        this.userService.update(user, Wrappers.lambdaUpdate(User.class).eq(User::getId, id));
//        } catch (InterruptedException e) {

//        } catch (BusinessException e) {

//        } catch (RuntimeException e) {

//        }
        System.out.println("lo结束=" + id);
        return Boolean.TRUE;
    }

    @Override
    public void begin() {

    }

    @Override
    public void result(boolean b, Long s, WorkResult<Boolean> workResult) {
//        if ("EXCEPTION".equals(workResult.getResultState().name())) {
//            throw new BusinessException(workResult.getEx().getMessage());
//        }
    }

    @Override
    public Boolean action(Long s, Map<String, WorkerWrapper> map) {
        return this.funcAsyncTool(s);
    }

    @Override
    public Boolean defaultValue() {
        return null;
    }
}

运行结果:

{
    "success": false,
    "code": "505",
    "message": "出现了2异常",
    "data": null
}

入参:[1,2,3,4,5]

运行结果,2、3没有更新,更新了1、4、5

相关文章:

  • 4、IP查找工具-Angry IP Scanner
  • 用deepseek学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
  • 周雨彤:用角色与生活,诠释审美的艺术
  • 1、cadence从零开始让一个VCO起振——基本设置
  • MATLAB算法实战应用案例精讲-【数模应用】空间插值(附MATLAB、R语言和python代码实现)
  • JavaScript设计模式 -- 迭代器模式
  • 【信息学奥赛一本通 C++题解】1285:最大上升子序列和
  • 同花顺数据爬取并生成K线
  • 【SpringBoot苍穹外卖】debugDay0 打开前端页面
  • sed命令详细教程
  • 力扣-二叉树-513 找二叉树左下角的值
  • FFmpeg 全面知识大纲梳理
  • 【LLM】浙大: 大模型基础 第一版 第一章:语言模型基础
  • CMake configure_file
  • Mycat中间件
  • 实现能源高效利用、优化能源结构、降低碳排放的智慧能源开源了
  • COBOL语言的移动应用开发
  • 第1章大型互联网公司的基础架构——1.3 HTTP-DNS
  • ### net7 + 出现了 自带的 限流中间件 固定窗口、滑动窗口 并发 令牌桶 全局限流器
  • deepseek本地部署方案(超简单)
  • 全文丨中华人民共和国民营经济促进法
  • 制定出台民营经济促进法有何重大意义?全国人大常委会法工委回应
  • 智能终端出海服务创新联合体成立
  • 石家庄:城市更新,生活向美
  • 今年一季度全国社会物流总额达91万亿元,工业品比重超八成
  • 在循环往复的拍摄中,重新发现世界