SchedulingConfigurer定时任务及多线程
启动类加@EnableScheduling注解
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.integration.redis.util.RedisLockRegistry; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; @Service @Slf4j @AllArgsConstructor public class TestClass implements SchedulingConfigurer { private static String test_cron; private RedisLockRegistry redisLockRegistry; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { test_cron= (String) getProperty("test_cron"); //设定一个长度为5的定时任务线程池 taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5)); Trigger trigger = triggerContext -> { test_cron= (String) getProperty("test_cron"); if ("0".equals(test_cron)||test_cron==null){ test_cron= "0 */1 * * * ?"; } CronTrigger trigger1 = new CronTrigger(test_cron); return trigger1.nextExecutionTime(triggerContext); }; taskRegistrar.addTriggerTask(() -> { if ("0".equals(test_cron)){ return; }//检查是否为0 如果是则跳过 Lock lock = redisLockRegistry.obtain("grabTask-lock");//分布式锁 获取锁 try{ boolean b1 = lock.tryLock(3, TimeUnit.SECONDS);//尝试加锁 如果加锁失败则跳过 if (!b1){ log.info("无法加锁grabTask-lock"); return; }
//do sth } }catch (Exception ex){ log.error("grabTask",ex); } } }catch(Exception ex){ log.error("grabTask",ex); }finally { try{ lock.unlock(); }catch (IllegalStateException ex){ log.error("grabTask-lock锁已释放"); } } }, trigger); } }

浙公网安备 33010602011771号