Spring定时任务使用

注解方式

基于Spring Boot项目

@SpringBootApplication  
@EnableScheduling  
public class EmqxHttpLoggerApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(EmqxHttpLoggerApplication.class, args);  
    }  
}
@Component  
@AllArgsConstructor  
public class MqttLogScheduler {  
  
    private final MqttLogMapper mqttLogMapper;  
  
    @Scheduled(cron = "0 0 3 * * ?")  
    public void deleteMqttLogCreatedOneMonthAgo() {  
        LocalDateTime oneMonthAgo = LocalDateTime.now().minusMonths(1);  
  
        LambdaQueryWrapper<MqttLog> mqttLogQueryWrapper = Wrappers.lambdaQuery();  
        mqttLogQueryWrapper.lt(MqttLog::getTimestamp, oneMonthAgo);  
  
        mqttLogMapper.delete(mqttLogQueryWrapper);  
    }  
}

ThreadPoolTaskScheduler方式

@Configuration  
public class SchedulerConfig {  
  
    private static final int SCHEDULER_POOL_SIZE = 5;  
  
    private static final String SCHEDULER_THREAD_NAME_PREFIX = "scheduler-";  
  
    @Bean  
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {  
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();  
        threadPoolTaskScheduler.setPoolSize(SCHEDULER_POOL_SIZE);  
        threadPoolTaskScheduler.setThreadNamePrefix(SCHEDULER_THREAD_NAME_PREFIX);  
        return threadPoolTaskScheduler;  
    }  
}
public interface SchedulerService {  
    void startTaskAtFixedRate(String taskName, Runnable task, long period);  
  
    void stopTask(String taskName);  
}
@Service  
@ThreadSafe  
public class SchedulerServiceImpl implements SchedulerService {  
  
    @GuardedBy("this")  
    private final Map<String, ScheduledFuture<?>> scheduledFutureMap = new HashMap<>();  
  
    private final ThreadPoolTaskScheduler threadPoolTaskScheduler;  
  
    public SchedulerServiceImpl(ThreadPoolTaskScheduler threadPoolTaskScheduler) {  
        this.threadPoolTaskScheduler = threadPoolTaskScheduler;  
    }  
  
    @Override  
    public synchronized void startTaskAtFixedRate(String taskName, Runnable task, long period) {  
        if (scheduledFutureMap.containsKey(taskName)) {  
            throw new DuplicatedTaskNameException("duplicated task name:" + taskName);  
        }  
        ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler.scheduleAtFixedRate(task, period);  
        scheduledFutureMap.put(taskName, scheduledFuture);  
    }  
    @Override  
    public synchronized void stopTask(String taskName) {  
        ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(taskName);  
        if (scheduledFuture == null || scheduledFuture.isCancelled()) {  
            return;  
        }  
        scheduledFuture.cancel(false);  
        scheduledFutureMap.remove(taskName);  
    }  
}