当前位置: 首页 > 知识库问答 >
问题:

Spring Boot中的计划方法

刁浩言
2023-03-14

我想在一段时间内发送一个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吗?有更好的方法吗?

谢谢

共有2个答案

卢健
2023-03-14

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

  1. 在spring boot应用程序类中添加@EnableScheduling注释@EnableScheduling是Spring上下文模块注释。它通过@Import(SchedulingConfiguration.class)指令在内部导入SchedulingConfiguration
@SpringBootApplication
@EnableScheduling
public class SpringBootWebApplication {
         
}

现在,您可以在要调度的方法上添加@Scheduled注释。唯一的条件是方法应该没有参数。

将由导入的SchedulingConfiguration创建的ScheduledAnnotationBeanPostProcessor扫描所有声明的bean,查看是否存在@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/

吕子真
2023-03-14

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

现在,控制器抽象本身应该执行任何业务逻辑。您可能希望验证请求中接收到的一些参数,或者通过一些定制将请求参数转换为java对象,然后调用实际执行业务逻辑的类(在spring universe中通常称为服务)。

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

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

  • 创建一个将执行代码的服务
  • 不要在控制器上放置任何与调度相关的东西
  • 从控制器调用服务
  • 创建一个bean,并在其上放置一个@计划的方法。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 ...}
}
 类似资料:
  • 我有一个简单的计划任务,它是使用@计划注释创建的。类似这样的东西- 我还有一个蓝绿色升级场景,在这个场景中,这个计划任务可能会在蓝色和绿色集群中运行。鉴于这个计划任务修改了数据库,其中一个节点可能会覆盖来自另一个节点的数据——或者最坏情况下的竞争条件。 我想暂停绿色集群上所有计划的任务,直到它准备好接受流量。我已经有了代码来监听应用程序状态的变化。 我探索了几个选择- 只需在任务开始时添加一个布尔

  • 本文向大家介绍MySQL的查询计划中ken_len的值计算方法,包括了MySQL的查询计划中ken_len的值计算方法的使用技巧和注意事项,需要的朋友参考一下 key_len的含义 在MySQL中,可以通过explain查看SQL语句所走的路径,如下所示: 其中,key_len表示使用的索引长度,是以字节为单位。在上面的例子中,由于int型占用4个字节,而索引中只包含了1列,所以,key_len是

  • 关于Java定时器类或ScheduledExecutorService接口,我可以在执行器线程(其他调度器)的运行方法(或TimerTask)内设置调度器(或定时器)吗? 案例研究:我有一个数据库,其中包含歌曲列表(10000首)和播放歌曲的时间表。 所以我想创建一个调度程序(比如1)(周期为1小时),它将搜索数据库,并为计划在一小时内播放的所有歌曲创建调度程序。 一小时后,scheduler1将

  • 我用SpringBoot创建了一个简单的演示应用程序,其中包括执行器。带有@Scheduled注释的任务显示在执行器中,但以编程方式启动的任务不会显示。有没有办法让他们也出现? 我已经注释了@Enable调度。 我的组件如下所示: 执行器的结果仅显示带注释的任务:

  • 我正在运行Spring 3.2.3。RELEASE和我在@Service修饰类中有几个方法,它们是计划任务,因此用@Scheduled注释修饰。 所有Springbean都在容器中被检测和实例化,但是从不调用@Scheduled注释。 我有几个应用程序上下文,但主文件描述如下: 另一个重要文件作为“core task scheduler.xml”导入。其配置如下: 最初,executor引用(如上

  • 我正在尝试编写一个apex类,当特定日期与今天的日期相差不到30天时,它会在自定义对象上检查chekbox。该课程应该每周运行一次,以不断检查应该更新的记录。我对Apex一无所知,我的代码是由我在其他线程中发现的各种snipped组成的。我想我几乎就知道了,但它一直显示以下错误消息:方法不存在或签名不正确:CustomersDateCheck类型中的void DateCheck()。 有人能帮我一