Spring 安排多个不同的时间

Spring scheduling for multiple different times

我目前正在做一个项目,当用户点击时自动抓取网页内容,但我遇到了一个问题,我需要 运行 在不同的时间不同的秒数中使用这些方法。我参考了 @Schedule 和 TimerTask,但它们只能在固定时间工作。我的情况有什么解决办法吗?

代码示例:

public void run(String selectedWeb) {
   if(selectedWeb.equals("First Web")) {
      scrapeFirstWeb(); //Need this method auto execute on 8, 30, 42 seconds every minute
   }else if(selectedWeb.equals("Second Web")) {
      scrapeSecondWeb(); //Need this method auto execute on 10am, 1pm, 11pm every day
   }    
}

PS: 我之前在 cron 中使用过 @Scheduled 注解,但是有一个问题是这个注解会自动 运行 所有的方法都包括那些我没有使用的方法 select 到 运行。因为我可能只抓取第一个网站或第二个网站,而不是同时抓取两个网站,但随后注释将忽略您拥有的网站 select,当时间到了时它也会执行。这就是我的问题。

如果有人知道有什么方法可以为我select只能做评论的方法做@Schedule注解运行让我知道,在此先感谢!

我建议使用可以随时停止的调度执行器:

 ScheduledExecutorService executorService = Executors
                .newSingleThreadScheduledExecutor();
        ScheduledFuture<?> in_method1 = executorService.scheduleAtFixedRate(() -> System.out.println("In method1"), 5, 3, TimeUnit.SECONDS);

        Thread.sleep(10000);
        in_method1.cancel(false);

终于找到解决这个问题的办法了,而且还可以用回@Schedule注解。

//Set @Scheduled annotation to false to avoid it auto execute when compile
@Value("${jobs.enabled:false}")
private boolean isEnabled;

public void run(String selectedWeb) {
   if(selectedWeb.equals("First Web")) {
      //Set it back to true when it has been selected
      isEnabled = true
      scrapeFirstWeb();
   }else if(selectedWeb.equals("Second Web")) {
      isEnabled = true
      scrapeSecondWeb();
   }    
}

@Scheduled(cron = "8,30,42 * * * * *")
    public void scrapeFirstWeb(){
    //So when isEnabled is false, it will not doing anything until it is true
    if(isEnabled){
       //Do something
    }
}

详细解释可以参考这里https://www.baeldung.com/spring-scheduled-enabled-conditionally