创建项目结构
使用 Spring Initializr 生成项目
- 依赖
- Spring Web
- Spring Data Redis
- Lombok
- Spring Boot DevTools
- Validation
接入 Redis
==配置 application.yml==
server:
port: 8080
spring:
redis:
host: localhost
port: 6379
添加业务包结构
手动建立清晰的包结构,便于长期维护。
com.delay.delaytaskscheduler
├── controller # 接口层
├── service # 业务逻辑
├── repository # 数据访问(Redis封装)
├── model # 实体类
├── config # 配置类
└── DelayTaskSchedulerApplication.java
接口-提交任务
- 实体类:model/DelayTask.java
package com.delay.delaytaskscheduler.model;
import lombok.Data;
@Data
public class DelayTask {
private String id;
private String content;
private long delaySeconds;
}
- Redis 操作类:repository/DelayTaskRepository.java
package com.delay.delaytaskscheduler.repository;
import com.delay.delaytaskscheduler.model.DelayTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import java.util.concurrent.TimeUnit;
@Repository
public class DelayTaskRepository {
private static final String KEY = "delay:tasks";
@Autowired
private StringRedisTemplate redisTemplate;
public void addTask(DelayTask task) {
long score = System.currentTimeMillis() + task.getDelaySeconds() * 1000;
redisTemplate.opsForZSet().add(KEY, task.getId(), score);
// task.getContent() 可另存在 hash 结构中
redisTemplate.opsForValue().set("task:body:" + task.getId(), task.getContent());
}
}
- 业务逻辑类:service/DelayTaskService.java
package com.delay.delaytaskscheduler.service;
import com.delay.delaytaskscheduler.model.DelayTask;
import com.delay.delaytaskscheduler.repository.DelayTaskRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DelayTaskService {
@Autowired
private DelayTaskRepository taskRepository;
public void submitTask(DelayTask task) {
taskRepository.addTask(task);
}
}
- 接口类:controller/DelayTaskController.java
package com.delay.delaytaskscheduler.controller;
import com.delay.delaytaskscheduler.model.DelayTask;
import com.delay.delaytaskscheduler.service.DelayTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/task")
public class DelayTaskController {
@Autowired
private DelayTaskService taskService;
@PostMapping
public String submit(@RequestBody DelayTask task) {
taskService.submitTask(task);
return "Task submitted: " + task.getId();
}
}
测试
POST
路径:
/task
请求体:
{ "id": "task-001",
"content": "send email to user",
"delaySeconds": 10
}
返回:
Task submitted: task-001
查看 Redis 数据
ZRange delay:tasks 0 -1 withscores
get task:body:task-001