注解方式
基于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);
}
}
PREVIOUSMaven依赖范围与传递性
NEXTRestTemplate使用