指定一个时间,完成定时任务

发布时间 2023-12-21 16:10:36作者: yaya_sama

有时候需要写一个定时触发的任务,例如设置公告定时发送

这里使用了spring中的定时任务类,很轻松的就完成了所需要的功能

1、定时任务,按照自己需求进行业务逻辑编写
/**
 * 定时任务
 * @Author:tzl
 * @Date:2023/12/20 17:47
 */
@Service
public class TaskService {

    public void executeTask(String name) {
        // 任务逻辑
        System.out.println(new Date());
        System.out.println(name + "发起的:  ---TaskService执行任务---");

    }
}
2、定时任务触发
/**
 * 定时任务触发
 * @Author:tzl
 * @Date:2023/12/20 17:48
 */
@Service
public class TaskSchedulingService {

    @Autowired
    private TaskService taskService;

    public void scheduleTask(Date taskTime,String name) {

        TaskScheduler taskScheduler = new ConcurrentTaskScheduler();

        taskScheduler.schedule(
                // 新建线程,执行任务
                () -> taskService.executeTask(name),
                // 任务触发时间
                taskTime
        );
    }
}

3、controller
/**
 * 定时任务请求
 * @Author:tzl
 * @Date:2023/12/20 17:49
 */
@RestController
public class TaskController {

    @Autowired
    private TaskSchedulingService schedulingService;

    @PostMapping("/scheduleTask")
    public ResponseEntity<String> scheduleTask(String taskTime, String name) {

        schedulingService.scheduleTask(getDate(taskTime),name);

        return ResponseEntity.ok("成功加入定时任务");
    }

    /**
     * 获取Date类型的时间
     * @param taskTime 任务启动时间
     * @return
     */
    private Date getDate(String taskTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(taskTime, formatter);

        // 将LocalDateTime转换为Instant
        Instant instant = dateTime.atZone(ZoneId.systemDefault()).toInstant();

        // 从Instant创建Date
        Date date = Date.from(instant);
        return date;
    }
}
4、测试

发送请求,等待时间到达

测试成功!