轻量级重试机制

在异步任务的场景中,为了保证正确及最终一致性,我们通常需要多次尝试直到任务成功或者尝试次数大于阈值。org.coodex.util.Retry基于这种场景提供了一个轻量级的解决方案。

示例:

        Retry.newBuilder()
//                // 最大尝试次数
//                .maxTimes(3)
//                // 第一次执行延迟时间,默认为0
//                .initDelay(20, TimeUnit.SECONDS)
//                // 延迟策略
//                .next(new Retry.TimeUnitNextDelay(TimeUnit.SECONDS) {
//                    @Override
//                    protected long delay(int times) {
//                        return 5;
//                    }
//                })
//                // 指定调度线程池
//                .scheduler(ExecutorsHelper.newSingleThreadScheduledExecutor("test"))
//                // 指定任务执行线程池,ScheduledExecutorService的线程数没法伸缩,所以,通过两个线程池来完成,
//                // 维持一个较小的ScheduledExecutorService进行任务调度,使用可伸缩ExecutorService进行任务执行
//                .executor(ExecutorsHelper.newLinkedThreadPool(
//                        1, 16, Integer.MAX_VALUE >> 1, 1L, "test-executor"
//                ))
//                //指定任务名
//                .named("TaskTest")
//                // or supplier方式指定任务名
//                .named(() -> "TaskTest")
//                //每次失败触发
//                .onFailed((start, times, throwable) ->
//                        log.info("on failed: {}, {}, {}", Common.calendarToStr(start), times, throwable == null ? "" : throwable.getLocalizedMessage()))
//                // 当任务尝试数超出最大阈值依然失败时的handle
//                .onAllFailed((start, times) -> log.info("all failed"))
                .build()
                // 要多次尝试执行的任务
                .execute(times -> {
                    log.debug("times: {}", times);
                    if (times % 2 == 0) {
                        throw new RuntimeException("mock exception:" + times);
                    }
                    return times == 5;
                });
© coodex.org 2014-2020 all right reserved,powered by GitbookFile Modify: 2020-05-11 14:33:51

results matching ""

    No results matching ""