Day1 - delay-task-secheduler 基础框架搭建

44 阅读1分钟

创建项目结构

使用 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

Git 提交并上传