溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot實(shí)現(xiàn)定時(shí)任務(wù)單線程多線程的方法

發(fā)布時(shí)間:2020-08-10 10:43:18 來(lái)源:億速云 閱讀:244 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下Spring Boot實(shí)現(xiàn)定時(shí)任務(wù)單線程多線程的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

1、創(chuàng)建定時(shí)任務(wù):

@Component
public class AutoNotifyController {


  /**
   * 獲取RedisUtils注入的bean
   *
   * @return
   */
  private ThreadUtil getThreadUtil() {
    ThreadUtil threadUtil = SpringContextUtil.getBean("threadUtil");
    return threadUtil;
  }


  /**
   * @描述: 推送啟動(dòng)充電結(jié)果的自動(dòng)獲取和處理分發(fā)方法
   * @輸入值: void
   * @返回值: void
   */
  @Scheduled(cron = "*/5 * * * * ?")
  public void AutoNotifyStartChargeResult() {
    getThreadUtil().AutoNotifyStartChargeResult();
  }


  /**
   * @描述: 推送充電狀態(tài)的自動(dòng)獲取和處理分發(fā)方法
   * @輸入值: void
   * @返回值: void
   */
  @Scheduled(cron = "*/50 * * * * ?")
  public void AutoNotifyChargeStatus() {
    getThreadUtil().AutoNotifyChargeStatus();
  }


  /**
   * @描述: 推送停止充電結(jié)果的自動(dòng)獲取和處理分發(fā)方法
   * @輸入值: void
   * @返回值: void
   */
  @Scheduled(cron = "*/5 * * * * ?")
  public void AutoNotifyStopChargeResult() {
    getThreadUtil().AutoNotifyStopChargeResult();
  }


  /**
   * @描述: 推送訂單信息的自動(dòng)獲取和處理分發(fā)方法
   * @輸入值: void
   * @返回值: void
   */
  @Scheduled(cron = "*/5 * * * * ?")
  public void AutoNotifyOrderInfo() {
    getThreadUtil().AutoNotifyOrderInfo();
  }


  /**
   * @描述: 公共信息部分的設(shè)備狀態(tài)變化推送接口的自動(dòng)獲取和處理分發(fā)方法
   * @輸入值: void
   * @返回值: void
   */
  @Scheduled(fixedRate = 200)
  public void checkGunStatus() {
    getThreadUtil().checkGunStatus();
  }


  /**
   * @描述: 對(duì)于Redis中的活躍訂單增加和刪除的輪詢執(zhí)行方法
   */
  @Scheduled(cron = "*/5 * * * * ?")
  public void ActiveOrderAddAndDelete() {
    getThreadUtil().ActiveOrderAddAndDelete();
  }


  /**
   * @描述: 對(duì)于Redis中的結(jié)束訂單訂單增加和刪除的輪詢執(zhí)行方法
   */
  @Scheduled(cron = "*/5 * * * * ?")
  public void EndOrderAddAndDelete() {
    getThreadUtil().EndOrderAddAndDelete();
  }


}

使用 @Scheduled來(lái)創(chuàng)建定時(shí)任務(wù) 這個(gè)注解用來(lái)標(biāo)注一個(gè)定時(shí)任務(wù)方法。

通過(guò)看 @Scheduled源碼可以看出它支持多種參數(shù):

(1)cron:cron表達(dá)式,指定任務(wù)在特定時(shí)間執(zhí)行;

(2)fixedDelay:表示上一次任務(wù)執(zhí)行完成后多久再次執(zhí)行,參數(shù)類型為long,單位ms;

(3)fixedDelayString:與fixedDelay含義一樣,只是參數(shù)類型變?yōu)镾tring;

(4)fixedRate:表示按一定的頻率執(zhí)行任務(wù),參數(shù)類型為long,單位ms;

(5)fixedRateString: 與fixedRate的含義一樣,只是將參數(shù)類型變?yōu)镾tring;

(6)initialDelay:表示延遲多久再第一次執(zhí)行任務(wù),參數(shù)類型為long,單位ms;

(7)initialDelayString:與initialDelay的含義一樣,只是將參數(shù)類型變?yōu)镾tring;

(8)zone:時(shí)區(qū),默認(rèn)為當(dāng)前時(shí)區(qū),一般沒(méi)有用到。

2、開(kāi)啟定時(shí)任務(wù):

@SpringBootApplication
@EnableScheduling
public class PositivebuttjointApplication extends SpringBootServletInitializer
{
  public static void main(String[] args)
  {
    SpringApplication.run(PositivebuttjointApplication.class, args);
  }

注:這里的 @EnableScheduling 注解,它的作用是發(fā)現(xiàn)注解 @Scheduled的任務(wù)并由后臺(tái)執(zhí)行。沒(méi)有它的話將無(wú)法執(zhí)行定時(shí)任務(wù)。

引用官方文檔原文:

@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.

3、執(zhí)行結(jié)果(單線程)

就完成了一個(gè)簡(jiǎn)單的定時(shí)任務(wù)模型,下面執(zhí)行springBoot觀察執(zhí)行結(jié)果:

Spring Boot實(shí)現(xiàn)定時(shí)任務(wù)單線程多線程的方法

從控制臺(tái)輸入的結(jié)果中我們可以看出所有的定時(shí)任務(wù)都是在同一個(gè)線程池用同一個(gè)線程來(lái)處理的,那么我們?nèi)绾蝸?lái)并發(fā)的處理各定時(shí)任務(wù)呢,請(qǐng)繼續(xù)向下看。

4、多線程處理定時(shí)任務(wù):

1.開(kāi)啟多線程

@SpringBootApplication
@EnableScheduling
@EnableAsync
public class PositivebuttjointApplication extends SpringBootServletInitializer
{

  public static void main(String[] args)
  {
    SpringApplication.run(PositivebuttjointApplication.class, args);

  }

加入@EnableAsync開(kāi)啟多線程

2.使用多線程

@Async
  public void AutoNotifyStartChargeResult() {
  }

   調(diào)用的方法上加上@Async使用多線程

  3.配置連接池  

@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {


  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(this.getTaskScheduler());
  }

  private ThreadPoolTaskScheduler getTaskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(20);
    taskScheduler.setThreadNamePrefix("schedule-pool-");
    taskScheduler.initialize();
    return taskScheduler;
  }
}

看完了這篇文章,相信你對(duì)Spring Boot實(shí)現(xiàn)定時(shí)任務(wù)單線程多線程的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI