首頁 > 軟體

Spring中@Scheduled功能的使用方法詳解

2022-04-08 16:00:21

前言

Spring 為任務排程和基於使用@Scheduled 註釋的 cron 表示式的非同步方法執行提供了極好的支援。可以將@Scheduled 註釋與觸發器後設資料一起新增到方法中。在這篇文章中,我將以4種不同的方式展示@Scheduled 功能的使用方法。

一、Spring @Scheduled Annotation

@ scheduled註釋用於任務排程。觸發器資訊需要與這個註釋一起提供。

您可以使用屬性 fixedDelay/fixedRate/cron 來提供觸發資訊。

  • fixedRate 使 Spring 定期執行任務,即使最後一次呼叫仍在執行
  • fixedDelay 特別控制最後一次執行結束時的下一次執行時間。
  • Cron 是一個源自 Unix cron 實用工具的特性,並且根據您的需求有各種選項。

範例用法如下:

@Scheduled Usages
@Scheduled(fixedDelay =30000)
public void demoServiceMethod () {... }
 
@Scheduled(fixedRate=30000)
public void demoServiceMethod () {... }
 
@Scheduled(cron="0 0 * * * *")
public void demoServiceMethod () {... }

1.2 如何啟用@Scheduled 註釋

要在 spring 應用程式中使用@Scheduled,必須首先在 applicationConfig.xml 檔案中定義 xml 名稱空間和模式位置定義。還新增任務: 註釋驅動,以支援基於註釋的任務排程。

applicationConfig.xml
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task/
http://www.springframework.org/schema/task/spring-task-3.0.xsd
 
<task:annotation-driven>

上面的新增是必要的,因為我們將使用基於註釋的設定。

1.3 使用@Scheduled 註釋

下一步是在類中建立一個類和一個方法,如下所示:

DemoService.java
public class DemoService
{
  @Scheduled(cron="*/5 * * * * ?")
  public void demoServiceMethod()
  {
    System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
  }
}

在上面的例子中

  • 使用@Scheduled 註釋反過來會使 Spring 容器理解這個註釋下面的方法將作為作業執行。
  • 記住,帶@Scheduled 註釋的方法不應該有傳遞給它們的引數。
  • 它們也不應該返回任何值
  • 如果希望在@Scheduled 方法中使用外部物件,應該使用自動連線將它們注入到 DemoService 類中,而不是將它們作為引數傳遞給@Scheduled 方法。

二、固定的延時和頻率使用@Scheduled

在這個方法中,fixedDelay 屬性與@Scheduled 註釋一起使用。

舉例:

DemoServiceBasicUsageFixedDelay.java
package com.howtodoinjava.service;
 
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
 
public class DemoServiceBasicUsageFixedDelay
{
 &nbsp;@Scheduled(fixedDelay = 5000)
 &nbsp;//@Scheduled(fixedRate = 5000)  //Or use this
 &nbsp;public void demoServiceMethod()
  {
 &nbsp; &nbsp;System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
  }
}
複製程式碼

應用程式設定如下:

applicationContext.xml
< ?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task/ http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    <task:annotation-driven />
    <bean id="demoServiceBasicUsageFixedDelay" class="com.howtodoinjava.service.DemoServiceBasicUsageFixedDelay"></bean>
</beans>

三、配合cron表示式使用@Scheduled

在此方法中,cron 屬性與@Scheduled 註釋一起使用。

舉例:

DemoServiceBasicUsageCron.java
package com.howtodoinjava.service;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
public class DemoServiceBasicUsageCron
{
  @Scheduled(cron="*/5 * * * * ?")
  public void demoServiceMethod()
  {
    System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
  }
}

應用程式設定如下:

applicationContext.xml
< ?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task/ http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    <task:annotation-driven />
    <bean id="demoServiceBasicUsageCron" class="com.howtodoinjava.service.DemoServiceBasicUsageCron"></bean>
</beans>

四、使用properties檔案設定Cron

在這個方法中,cron 屬性與@Scheduled 註釋一起使用。此屬性的值必須是 cron 表示式,如前面的方法所示,但是,此 cron 表示式將在屬性檔案中定義,相關屬性的鍵將用於@Scheduled 註釋。

這將使 cron 表示式與原始碼分離,從而使更改變得容易。

DemoServicePropertiesExample.java
package com.howtodoinjava.service;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
public class DemoServicePropertiesExample {
  @Scheduled(cron = "${cron.expression}")
  public void demoServiceMethod()
  {
    System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
  }
}

應用程式設定如下:

applicationContext.xml
<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task/ http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    <task:annotation-driven />
    <util:properties id="applicationProps" location="application.properties" />
  <context:property-placeholder properties-ref="applicationProps" />
    <bean id="demoServicePropertiesExample" class="com.howtodoinjava.service.DemoServicePropertiesExample"></bean>
</beans>

五、使用context設定Cron

該方法在屬性檔案中設定 cron 表示式,在組態檔中使用 cron 表示式的屬性鍵設定作業排程。主要的變化是您不需要在任何方法上使用@Scheduled 註釋。方法設定也是在應用程式組態檔中完成的。

舉例:

DemoServiceXmlConfig.java
package com.howtodoinjava.service;
import java.util.Date;
public class DemoServiceXmlConfig
{
  public void demoServiceMethod()
  {
    System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
  }
}

應用程式設定如下:

applicationContext.xml
<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task/ http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    <task:annotation-driven />
    <util:properties id="applicationProps" location="application.properties" />
  <context:property-placeholder properties-ref="applicationProps" />
  <bean id="demoServiceXmlConfig" class="com.howtodoinjava.service.DemoServiceXmlConfig" />
  <task:scheduled-tasks>
      <task:scheduled ref="demoServiceXmlConfig" method="demoServiceMethod" cron="#{applicationProps['cron.expression']}"></task:scheduled>
  </task:scheduled-tasks>
</beans>

總結

到此這篇關於Spring中@Scheduled功能使用的文章就介紹到這了,更多相關Spring @Scheduled使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com