try resource

ry-with-resources 语法进行了较为深入的剖析,验证了其为一种语法糖,同时给出了其实际的实现方式的反编译结果,相信你在看完本文后,关于 AutoCloseable 的使用你会有新的收获。

// 伪代码片段 1 - AutocloseableWrapper 类的定义
class AutocloseableWrapper<T> implements Autocloseable {
    private final T resource;
    private final Consumer<T> close;

    public AutocloseableWrapper(T resource, Consumer<T> close) {
        this.resource = resource;
        this.close = close;
    }

    @Override
    public void close() throws Exception {
        close.accept(resource);
    }

    public static <T> Try.WithResources<AutocloseableWrapper<T>> tryAutoclose(T resource, Consumer<T> close) {
        return Try.withResources(() -> new AutocloseableWrapper<>(resource, close));
    }
}

// 伪代码片段 2 - 使用 AutocloseableWrapper 进行资源管理的代码示例
int maxTaskNumber = getDefaultMaxTaskNumber();

// 假设以下代码在某个方法中执行
AutocloseableWrapper<RLock> wrapper = AutocloseableWrapper.tryAutoclose(
    redissonClient.getLock(lockName),
    rLock -> {
        if (rLock.isLocked() && rLock.isHeldByCurrentThread()) {
            rLock.unlock();
        }
    }
);

RLock rLock = wrapper.getResource();
boolean tryLock = rLock.tryLock(time, TimeUnit.SECONDS);
if (Boolean.FALSE.equals(tryLock)) {
    return new ArrayList<BatchElasticSearchTaskEntity>();
}

// 假设以下为获取任务的逻辑
Map<DynamicAssignmentUtil.TypeWeight<BlazeEnvType>, Collection<BatchElasticSearchTaskEntity>> resources = new HashMap<>();
BlazeEnvType[] envTypes = BlazeEnvType.values();
Arrays.stream(envTypes)
    .filter(type -> !BlazeEnvType.UNKNOWN.equals(type) && !BlazeEnvType.BETA_TWO.equals(type))
    .forEach(type -> {
        DynamicAssignmentUtil.TypeWeight<BlazeEnvType> typeWeight = new DynamicAssignmentUtil.TypeWeight<>();
        typeWeight.setType(type);
        typeWeight.setWeight(getWeightByBlazeEnvType(type));
        // 每个环境拉取指定数量的任务
        List<BatchElasticSearchTaskEntity> list = acquireTaskWithBlazeEnvType(type, getMaxTaskNumberByBlazeEnvType(type));
        resources.put(typeWeight, list);
    });

return resources.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));