自己喜欢的代码

每次开发的时候总可以写出一些自己很满意的东西。这些代码也给自己带来了小确幸。在这记录一下。可能以后也会有用。

@Transactional(REQUIRES_NEW)
public void handleException(long statusFrom, long statusTo, long statusError, TProcess process) {

    process = processRepository.findById(process.getId()).get();
    process.edit();
    if (process.getExecuteTimes() != null && maxTryTimes == process.getExecuteTimes()) {
        process.setStatus(statusError);
        log.warn("the process failed finally. The status would update to {}", statusError);
    } else {
        process.setExecuteTimes(process.getExecuteTimes() == null ? 1 : process.getExecuteTimes() + 1);
        log.warn("the process failed. It would run again.");
    }
    processRepository.save(process);
}

注意

  1. 这段代码调用在主代码的catch中。所以这里面的事务如果是之前的事务,那么事务也不会执行。必须开启新的事务。@Transactional(REQUIRES_NEW)
  2. 这段代码不可以在主逻辑的类中,如果是在主类中,@Transactional不会生效。因为没有办法代理生成你需要的代码。
public void persistData() {

    executeJobFunction
 ("persistData", processServices::persistData);
}

public void executeJobFunction
 (String message, Runnable function) {
    long start = System.currentTimeMillis();
    log.info("start to deal with the method: {}", message);
    function.run();
    log.info("finish to deal with the method: {}. The method cost {} millis.", message, System.currentTimeMillis() - start);
}

包围打log的代码,这里没有使用AOP,而是使用的方法的简单调用。传入一个Runnable的方法就可以了。

private  void splitConsumeList(List lists, Consumer> consumer) {
    if (CollectionUtils.isEmpty(lists)) {
        log.info("no data to consume.");
        return;
    }
    splitConsumeList(lists, consumer, DEFAULT_PAGE_SIZE);
}

private  void splitConsumeList(List lists, Consumer> consumer, int pageSize) {
    int size;
    if (lists.size() % pageSize == 0) {
        size = lists.size() / pageSize;
    } else {
        size = (lists.size() + pageSize - 1) / pageSize;
    }
    for (int i = 0; i < size; i++) {
        int from = i * pageSize;
        int end = Math.min(lists.size(), (i + 1) * pageSize);
        List subContractNumbers = lists.subList(i * pageSize, end);
        log.info("consume list from: {} to end: {}.", from, end);
        consumer.accept(subContractNumbers);
    }
}

代码里面有大量的插入操作。为了限制每批作业个数限制。或者是delete * from where in (?,?)。防止in的个数超过限制。写了把list分批作业的方法。

编辑的时候还发现自己一个bug,subList这个方法是左闭右开的。所以end取值不用-1。每次调用新的API的时候还是需要测试的啊。

你可能感兴趣的:(JAVA基础,代码重构,java,开发语言)