Java中实现定时任务

一、定时任务的主体业务

如果是单线程单服务的可以把上锁操作干掉,我信你不会删的!

@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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值