1.编写LockUtil工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisStringCommands.SetOption;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Service;

/**
 * LockUtil <br>
 *
 */
@Service
public class LockUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * @param lockKey 上锁的key
     * @param lockSeconds 上锁的秒数
     * @return
     */
    public boolean lock(String lockKey, int lockSeconds) {
        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
            byte[] key = lockKey.getBytes();
            Boolean set = connection.set(key, key, Expiration.seconds(lockSeconds), SetOption.SET_IF_ABSENT);
            if (set == null) {
                return false;
            }
            return set;
        });
    }

    public boolean isLock(String lockKey) {
        return stringRedisTemplate.opsForValue().get(lockKey)!=null;
    }


    public boolean clearLock(String lockKey){
       return redisTemplate.delete(lockKey);
    }
}

2.使用锁

public abstract class AbstractTask {

    @Autowired
    private LockUtil lockUtil;

    /**
     * 获取redis锁的key
     *
     * @return
     */
    protected abstract String getLockKey();

    protected boolean lock() {
        return lockUtil.lock(getLockKey(), 120);
    }

    protected boolean lockManual() {
        return lockUtil.lock(getLockKey(), 299);
    }

    protected boolean clearLock() {
        return lockUtil.clearLock(getLockKey());
    }
}


@Component
@Slf4j
@RefreshScope
public class FileCapacityCountTask extends AbstractTask{
    @Autowired
    private FileCapacityCountService fileCapacityCountService;
   

    @Scheduled(cron = "${batch.verification.schedule.capacity}")
    public void task(){
        if (!lock()) {
            log.info("本实例无需执行定时任务");
            return;
        }
        fileCapacityCountService.fileCapacityCountTask();
    }

    @Override
    protected String getLockKey() {
        String today = DateUtil.formatDate(new Date());
        return FileCapacityCountTask.class.getSimpleName() + CommonConstant.APPLICATION_NAME + today;
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐