一、定时任务的主体业务
如果是单线程单服务的可以把上锁操作干掉,我信你不会删的!
@Log4j2
@Configuration
@EnableScheduling
public class SendMessageJob implements InitializingBean {
@Autowired
private RedisUtils redisUtils;
@Autowired
private SendInterfaceLogService sendInterfaceLogService;
private static final String REDIS_INVATINVOICE_LOCK = "sendSettlementMessageTasks_lock";
/**
* 定时推送发票
*/
@Scheduled(cron = "0 0 22 * * ?")//秒 分 时 日 月 星期 年 半小时一次
// @Scheduled(cron = "0 0/10 * * * ? ")
private void sendMessageTasks() {
try {
if (redisUtils.setIfAbsent(REDIS_INVATINVOICE_LOCK, "settlementTasks")) {
try {
System.err.println("发票组装推送开始时间: " + LocalDateTime.now());
//需要执行的业务内容
sendInterfaceLogService.sendInvatinvoiceMessageJob();
System.err.println("发票组装推送结束时间: " + LocalDateTime.now());
} catch (Exception e) {
log.info("发票组装推送异常结束时间: " + LocalDateTime.now());
e.printStackTrace();
}
} else {
System.err.println("发票组装推送执行定时任务时间: 1 锁被占用了");
}
} catch (Exception e) {
redisUtils.del(REDIS_INVATINVOICE_LOCK);
}
redisUtils.del(REDIS_INVATINVOICE_LOCK);
}
/**
* 重写afterPropertiesSet来实现线程一直存在
*/
@Override
public void afterPropertiesSet() throws Exception {
// 避免线程一直被存在, 启动时将数据删除一下
redisUtils.del(REDIS_INVATINVOICE_LOCK);
}
}
二、进行redis锁的释放
/**
* redis删除缓存
*
* @param key 可以传一个值 或多个
*/
public void del(String... keys) {
if (keys != null && keys.length > 0) {
if (keys.length == 1) {
boolean result = redisTemplate.delete(keys[0]);
log.debug("--------------------------------------------");
log.debug(new StringBuilder("删除缓存:").append(keys[0]).append(",结果:").append(result).toString());
log.debug("--------------------------------------------");
} else {
Set<Object> keySet = new HashSet<>();
for (String key : keys) {
keySet.addAll(redisTemplate.keys(key));
}
long count = redisTemplate.delete(keySet);
log.debug("--------------------------------------------");
log.debug("成功删除缓存:" + keySet.toString());
log.debug("缓存删除数量:" + count + "个");
log.debug("--------------------------------------------");
}
}
}
三、进行redis的上锁
/**
* redis上锁
*/
public boolean setIfAbsent(String key, Object value) {
return redisTemplate.opsForValue().setIfAbsent(key, value);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Boy_Martin/article/details/126059133