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测试结果