指定时间执行任务
说明:
不想通过定时任务来扫码的前提下,要在指定时间执行对应任务。可以通过本文的这种方式来实现。
上代码:
AsyncTaskHandler – 本文核心类:对于要执行任务的处理器
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
public class AsyncTaskHandler {
private ThreadPoolTaskScheduler scheduler;
public void setScheduler(ThreadPoolTaskScheduler scheduler) {
this.scheduler = scheduler;
}
private final Map<Long, ScheduledFuture<?>> futures = new HashMap<>();
public void addTask(Runnable task, Date date, Long businessId) {
// 移除已取消或已完成的任务
futures.entrySet().removeIf(entry -> entry.getValue().isDone() || entry.getValue().isCancelled());
ScheduledFuture<?> future = futures.get(businessId);
if (future != null) {
future.cancel(true);
}
future = this.scheduler.schedule(task, date);
futures.put(businessId, future);
}
public void delTask(Integer taskType, Long businessId) {
final ScheduledFuture<?> future = futures.get(businessId);
if (future != null) {
final boolean canceled = future.cancel(true);
if (canceled) {
futures.remove(businessId);
}
}
}
}
MyTestScheduleTask 自定义的任务类
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author: wumiao
* @Description: 自定义的任务
* @Create: 2021-10-19 17:26
**/
public class MyTestScheduleTask implements Runnable{
private Long businessId;
private Date excuteTime;
public MyTestScheduleTask(Long businessId, Date excuteTime) {
this.businessId = businessId;
this.excuteTime = excuteTime;
}
@Override
public void run() {
//这里放置要执行的任务代码
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("任务执行了 执行时间:" + sdf.format(date));
}
}
task-beans.xml 添加配置文件,给AsyncTaskHandler设置属性
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="threadPoolTaskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="5"/>
</bean>
<bean id="asyncTaskHandler" class="com.wu.springbootfileupload.handler.AsyncTaskHandler" >
<property name="scheduler" ref="threadPoolTaskScheduler"/>
</bean>
</beans>
实验
@RequestMapping("/scheduler/add")
public String scheduler(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date date) {
Long businessId = 1L;
MyTestScheduleTask task = new MyTestScheduleTask(businessId, date);
asyncTaskHandler.addTask(task, date, businessId);
return "ok";
}
进行接口调用
查看控制台: