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測試結果