App下載

springboot 定時任務(wù),異步任務(wù)的案例分享

猿友 2020-07-28 15:47:56 瀏覽數(shù) (4446)
反饋

整理這篇文章是為了給大家分享兩個springboot的異步任務(wù)、定時任務(wù)的簡單案例,讓大家有個參考對象。

異步任務(wù)簡單案例

在我們開發(fā)項目時,常常會用到異步處理任務(wù),比如我們在網(wǎng)站上發(fā)送郵件,后臺會去發(fā)送郵件,此時會造成前臺響應(yīng)不動,直到郵件發(fā)送完畢,響應(yīng)才會成功,所以我們一般會采用多線程的方式去處理這些任務(wù)。

  1. 新建一個service

  1. 創(chuàng)建AsyncService

@Service
    public class AsyncService {

    
       public void hello(){
           try {
               Thread.sleep(3000);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
           System.out.println("業(yè)務(wù)進行中~~");
      }
    }

  1. 創(chuàng)建controller

  1. controller包下創(chuàng)建一個AsyncController

@RestController
    public class AsyncController {

    
       @Autowired
       AsyncService asyncService;

    
       @GetMapping("/hello")
       public String hello(){//調(diào)用方法后會延遲3秒在頁面顯示Success
           asyncService.hello();
           return "success";
      }

    
    }

此時訪問Localhost:8080/hello的情況是:延遲3秒后,在頁面輸出Success,在后臺會輸出業(yè)務(wù)進行中~~

新問題:如果想頁面直接輸出信息“Success”,而讓這個hello方法直接在后臺用多線程操作,就需要加上@Async注解,這樣spring boot就會自己開一個線程池進行調(diào)用

改進:給AsyncService加上注解

@Async//告訴Spring這是一個異步方法
    public void hello(){
       try {
           Thread.sleep(3000);
      } catch (InterruptedException e) {
           e.printStackTrace();
      }
       System.out.println("業(yè)務(wù)進行中~~");
    }

但是要讓這個注解起作用,還需要在入口文件中開啟異步注解功能

@EnableAsync //開啟異步注解功能
@SpringBootApplication
    public class SpringbootTaskApplication {
           public static void main(String[] args) {
               SpringApplication.run(SpringbootTaskApplication.class, args);
          }
    }

此時再次測試,發(fā)現(xiàn)頁面直接輸出了Success,但是后臺仍然是3秒后輸出業(yè)務(wù)進行中

定時任務(wù)簡單案例

工作中常常要設(shè)置一些定時任務(wù),比如每天在某個時間分析一遍日志

所以Spring提供了異步執(zhí)行任務(wù)調(diào)度的方式,提供了兩個接口。

TaskExecutor接口

TaskScheduler接口

兩個注解:

? @EnableScheduling

? @Scheduled

創(chuàng)建一個ScheduleService,里面編寫一個hello方法,讓它定時執(zhí)行

@Service
publicclassScheduledService{


    //秒分時日月周幾
    @Scheduled(cron="0 * * * * ?")
    //這里需要學(xué)習(xí)一些cron表達式的語法,明白時間如何設(shè)置,這里的意思是每當(dāng)時間到0秒時就執(zhí)行一次
    publicvoidhello(){
        System.out.println("hello/////");
    }
}

要使用定時功能,還需要在入口文件中加上@EnableScheduling,表明開啟定時任務(wù)功能

@SpringBootApplication
    @EnableScheduling//開啟定時任務(wù)注解功能
    @EnableAsync//開啟異步注解功能
    publicclassSpringbootTaskApplication{

    
    publicstaticvoidmain(String[]args){
    SpringApplication.run(SpringbootTaskApplication.class,args);
    }

    
    }

此時測試運行,發(fā)現(xiàn)每當(dāng)時間為0秒時就會在后臺打印出 hello////

任務(wù)輸出結(jié)果

以上就是分享的兩個簡單案例,對SpringBootjava有學(xué)習(xí)興趣的同學(xué),可以看一下教程

Java教程:http://hgci.cn/java/

Java微課:http://hgci.cn/minicourse/play/javaminicourse

SpringBoot教程:http://hgci.cn/seansblog/

SpringBoot從入門到精通微課:http://hgci.cn/minicourse/play/springboot_my

0 人點贊