SpringBoot 任務調度 異步任務調度 與日誌管理

1.任務調度

1.1在啓動類中添加@EnableScheduling註解,開啓定時任務
在這裏插入圖片描述
1.2定時任務業務類 加註解 @Component被容器掃描
啓動後每2秒執行此任務一次
在這裏插入圖片描述
1.3測試
在這裏插入圖片描述

2.異步任務調度

2.1在啓動類中添加@EnableAsync 註解,開啓異步任務調度
2.2編寫異步任務類

   @Component
public class AsyncTaskTest {

    @Async//標明此方法是異步任務調度方法
    /**
     * 開啓一個異步任務調度
     */
    public Future<String> async1() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(2000);
        System.out.println("異步任務1執行了。。。");
        long end = System.currentTimeMillis();
        long time = end-start;
        System.out.println("異步任務1執行的時間:"+time);
        return new AsyncResult<String>("任務1");
    }
     @Async
    /**
     * 開啓一個異步任務調度
     */
    public Future<String> async2() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(2000);
        System.out.println("異步任務2執行了。。。");
        long end = System.currentTimeMillis();
        long time = end-start;
        System.out.println("異步任務2執行的時間:"+time);
        return new AsyncResult<String>("任務2");
    }

    @Async
    /**
     * 開啓一個異步任務調度
     */
    public Future<String> async3() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(2000);
        System.out.println("異步任務3執行了。。。");
        long end = System.currentTimeMillis();
        long time = end-start;
        System.out.println("異步任務3執行的時間:"+time);
        return new AsyncResult<String>("任務3");
    }
}

2.3編寫controller測試類

@RestController
public class AscynController {

    private Logger logger = LoggerFactory.getLogger(Logger.class);

    @Autowired
    private AsyncTaskTest taskTest;

    @GetMapping("/api/async")
    public JsonData testAsync() throws InterruptedException {

        long start = System.currentTimeMillis();
        //異步任務調度同時執行三個任務而普通任務調度需要一個一個的執行
        Future<String> task1 = taskTest.async1();
        Future<String> task2 = taskTest.async2();
        Future<String> task3 = taskTest.async3();

        Thread.sleep(2000); //模擬網絡請求 ,休眠2秒鐘

        while(true){
            if(task1.isDone()&&task2.isDone()&&task3.isDone()){
                break;  //異步任務內部所有接口都執行完畢,終止循環
            }
        }
        long end = System.currentTimeMillis();
        long time = end - start;
        System.out.println("總的執行時間:"+time);

        logger.info("異步任務調度");

        return JsonData.buildSuccess(time);
    }
}

2.4測試結果
在這裏插入圖片描述

3.日誌管理

將日誌打印到文件
1.1添加日誌配置文件,文件路徑與application.properties同級

<?xml version="1.0" encoding="UTF-8" ?>


<!--日誌配置文件-->
<configuration>

    <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </layout>
    </appender>

    <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        <!-- 滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路徑 -->
            <fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>

        <!-- 設置滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路徑 -->
            <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>

            <!-- 控制保留的歸檔文件的最大數量,超出數量就刪除舊文件,假設設置每個月滾動,
            且<maxHistory>1,則只保存最近1個月的文件,刪除之前的舊文件 -->
            <MaxHistory>1</MaxHistory>

        </rollingPolicy>
    </appender>
    <root level="INFO">
        <appender-ref ref="consoleApp"/>
        <appender-ref ref="fileInfoApp"/>
        <appender-ref ref="fileErrorApp"/>
    </root>
</configuration>

3.2日誌調用

@RestController
public class LogController {

    private Logger logger = LoggerFactory.getLogger(Logger.class);

    @GetMapping("/api/log")
    public Object testLog(){
        logger.error("這是一個error級別日誌");
        logger.info("這是一個info級別日誌");
        logger.debug("這是一個debug級別日誌");
        logger.warn("這是一個warn級別日誌");

        return JsonData.buildSuccess();
    }
}

3.3測試結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章