Spring 启动中的预定方法

Scheduled method in Spring Boot

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

@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 吗?有没有更好的方法呢?

谢谢!

要定期将 spring 启动应用程序中的作业安排到 运行,spring 启动提供 @EnableScheduling 和 @Scheduled 注释。在我看来,由于 spring boot 为调度程序提供了注释和功能,因此使用它会更有意义

  1. @EnableScheduling 注释添加到 spring 启动应用程序 class。@EnableScheduling 是一个 Spring 上下文模块注释。它通过 @Import(SchedulingConfiguration.class) 指令在内部导入 SchedulingConfiguration
@SpringBootApplication
@EnableScheduling
public class SpringBootWebApplication {
         
}
  1. 现在您可以在要安排的方法上添加 @Scheduled 注释。唯一的条件是方法应该没有参数。

    ScheduledAnnotationBeanPostProcessor 将由 imported SchedulingConfiguration 扫描所有已声明的 beans @Scheduled 注释的存在。

    对于每个没有参数的注释方法,都会创建适当的执行程序线程池。此线程池将管理注释方法的计划调用。

@Scheduled(initialDelay = 1000, fixedRate = 10000)
public void run() {
    logger.info("Current time is :: " + Calendar.getInstance().getTime());
}

来源:https://howtodoinjava.com/spring-boot/enable-scheduling-scheduled-job-example/

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

现在,控制器抽象本身应该执行任何业务逻辑。您可能想要验证请求中收到的一些参数,也许将请求参数转换为具有某些自定义功能的 java 对象,然后调用 class(通常在 spring 宇宙中称为服务)实际上执行您的业务逻辑。

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

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

  • 创建将执行代码的服务
  • 不要在控制器上放置任何与调度相关的东西
  • 从控制器调用服务
  • 创建一个 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 ...}
}