首页 > 解决方案 > Spring Boot 中的计划方法

问题描述

我想在一段时间内发送一个帖子请求。我创建了这样的方法;

@Scheduled(cron = "0 0 */6 * *")
@PostMapping
public List<TagsRes> getTags(Date date) {
    return null;
}

@Scheduled(cron = "0 0 5 * * ?")
@PostMapping
public List<TagsRes> getAll() {
    return null;
}

我应该在我的控制器中使用@Scheduled 吗?有没有更好的方法呢?

谢谢!

标签: springspring-bootspring-mvcspring-scheduled

解决方案


控制器旨在接收 Web 请求,而不是发布任何内容。您可以将它们视为由您的应用程序公开并由外部服务不时调用的端点。

现在,Controller 抽象本身应该执行任何业务逻辑。您可能想要验证请求中接收到的一些参数,可能需要通过一些自定义将请求参数转换为 java 对象,然后调用实际执行您的业务逻辑的类(通常在 Spring Universe 中称为 Service)。

现在回到你的问题。我怀疑您不应该“发布请求”,而应该调用一些代码“就好像有人调用了控制器的方法(端点)”。但这一次不是外部“用户”会导致代码执行,而是内部调度程序。

如果是这样,您可以稍微重构代码以获得更好的清晰度:

  • 创建一个将执行代码的服务
  • 不要在控制器上放置任何与调度相关的东西
  • 从控制器调用服务
  • 创建一个 bean 并在其上放置一个“@Scheduled”方法。bean 将注入服务并像控制器​​一样调用它。

不要忘记添加@EnableScheduling注释 - 否则计划的代码将无法运行。


public class MyService {
   public void doBusinessLogic(){ ... }
}

@RestController
public class MyController {
    @Autowired
    private MyService service;
    public void myPostMethod(...) {
      service.doBusinessLogic(...);
    }
} 

public class MyScheduledInvoker {
    @Autowired
    private MyService service;

    @Scheduled(...cron expression or whatever...) 
    public void invokeScheduled() {
       service.doBusinessLogic(...);
    }
}


@SpringBootApplication
@EnableScheduling
public class MyApp {

     public static void main(String [] args) { .... run the app ...}
}

推荐阅读