SpringBoot基于Mybatis-plus实现定时器任务管理
时间: 2023-05-24 20:03:44 浏览: 287
A:实现定时器任务管理可以使用Spring Boot提供的定时任务(@Scheduled)和Mybatis-Plus提供的定时任务表(定时器任务表在Mybatis-Plus 3.1.1版本及以上已支持,使用Mybatis-Plus官方提供的SQL脚本创建定时器任务表)。
1. 首先,在项目中引入Mybatis-Plus和定时任务依赖。
```xml
<!-- Mybatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>{mybatis-plus.version}</version>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>{spring.version}</version>
</dependency>
```
2. 创建定时器任务表。
可以直接在数据库中执行Mybatis-Plus官方提供的SQL脚本,创建定时器任务表(或者在Mybatis-Plus 3.1.1版本之后,通过注解方式自动创建)。
```sql
CREATE TABLE `tb_task` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_group` varchar(50) NOT NULL COMMENT '任务组',
`task_name` varchar(50) NOT NULL COMMENT '任务名称',
`task_cron` varchar(50) NOT NULL COMMENT '任务执行cron表达式',
`task_class` varchar(500) NOT NULL COMMENT '任务具体执行类',
`task_method` varchar(50) NOT NULL COMMENT '任务具体执行方法',
`task_data` varchar(500) DEFAULT NULL COMMENT '任务执行参数',
`task_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '任务状态(0:停止,1:运行)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务表';
```
3. 创建定时器任务实体类。
```java
@Data
@TableName("tb_task")
public class Task extends BaseEntity {
/**
* 任务组(用于区分不同业务)
*/
private String taskGroup;
/**
* 任务名称
*/
private String taskName;
/**
* 任务执行cron表达式
*/
private String taskCron;
/**
* 任务具体执行类
*/
private String taskClass;
/**
* 任务具体执行方法
*/
private String taskMethod;
/**
* 任务执行参数
*/
private String taskData;
/**
* 任务状态(0:停止,1:运行)
*/
private Integer taskStatus;
/**
* 备注
*/
private String remark;
}
```
4. 创建定时器任务管理接口和实现类。
```java
public interface TaskService extends IService<Task> {
/**
* 执行定时任务
*/
void runTask(Task task);
/**
* 根据任务组和任务名称获取任务
*/
Task getTaskByGroupAndName(String taskGroup, String taskName);
/**
* 更新任务状态
*/
boolean updateTaskStatus(Long id, Integer taskStatus);
}
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
@Autowired
private ApplicationContext applicationContext;
@Override
public void runTask(Task task) {
try {
// 获取任务类
Object taskObj = applicationContext.getBean(task.getTaskClass());
if (null == taskObj) {
throw new RuntimeException("No such task class found!");
}
// 获取任务方法
Method method = taskObj.getClass().getMethod(task.getTaskMethod(), String.class);
// 执行任务方法
method.invoke(taskObj, task.getTaskData());
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
@Override
public Task getTaskByGroupAndName(String taskGroup, String taskName) {
QueryWrapper<Task> wrapper = new QueryWrapper<>();
wrapper.eq("task_group", taskGroup)
.eq("task_name", taskName);
return baseMapper.selectOne(wrapper);
}
@Override
public boolean updateTaskStatus(Long id, Integer taskStatus) {
Task task = new Task();
task.setId(id);
task.setTaskStatus(taskStatus);
return updateById(task);
}
}
```
5. 配置定时任务。
```java
@Configuration
@EnableScheduling
public class TaskConfig {
@Autowired
private TaskService taskService;
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@Scheduled(fixedRate = 5000) // 每隔5000ms执行一次
public void runTask() {
// 获取需要执行的任务列表
List<Task> taskList = taskService.list(new QueryWrapper<Task>().eq("task_status", 1));
if (CollectionUtils.isEmpty(taskList)) {
return;
}
// 执行任务
for (Task task : taskList) {
taskScheduler.schedule(new TaskRunnable(taskService, task), new CronTrigger(task.getTaskCron()));
}
}
/**
* 定时器任务运行线程
*/
public static class TaskRunnable implements Runnable {
private TaskService taskService;
private Task task;
public TaskRunnable(TaskService taskService, Task task) {
this.taskService = taskService;
this.task = task;
}
@Override
public void run() {
// 执行任务
taskService.runTask(task);
// 更新任务状态
taskService.updateTaskStatus(task.getId(), 1);
}
}
}
```
6. 启动项目,添加定时器任务,等待定时任务执行。
以上就是基于Mybatis-Plus实现定时器任务管理的过程,希望对你有所帮助。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)