一、任务调度
- 定时任务的配置
–schedule基本使用步骤:
1)启动类里面 @EnableScheduling开启定时任务,自动扫描
@SpringBootApplication
@EnableScheduling //开启 定时任务 自动扫描
public class Springboot05Application {
public static void main(String[] args) {
SpringApplication.run(Springboot05Application.class, args);
}
}
2)定时任务业务类 加注解 @Component被容器扫描
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次
@Component
public class TaskTest {
@Scheduled(fixedRate = 2000) //定时2秒执行一次
public void test1(){
System.out.println("任务调度1------" + new Date());
}
}
- 其他配置
a、cron配置定时任务表达式https://tool.lu/crontab/
b、fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行;)
c、fixedDelay: 上一次执行结束时间点后xx秒再次执行
d、fixedDelayString: 字符串形式,可以通过配置文件指定
@Component
public class TaskTest {
@Scheduled(cron = "*/2 * * * * *") //定时2秒执行一次
public void test2(){
System.out.println("任务调度2------" + new Date());
}
@Scheduled(fixedDelay = 3000) //上一次执行结束时间点后3秒再次执行
public void test3(){
System.out.println("任务调度3------" + new Date());
}
@Scheduled(fixedDelayString = "3000") //字符串形式,上一次执行结束时间点后3秒再次执行
public void test4(){
System.out.println("任务调度4------" + new Date());
}
}
- 配置异步定时任务
a.启动类需加注解:@EnableAsync
@SpringBootApplication
//@EnableAsync //异步定时任务
public class Springboot05Application {
public static void main(String[] args) {
SpringApplication.run(Springboot05Application.class, args);
}
}
b.增加Future 返回结果 AsyncResult(“task执行完成”);
c.如果需要拿到结果 需要判断全部的 task.isDone()
@RestController
@RequestMapping("/api")
public class AsyncController {
@Autowired
public AsyncTask asyncTask;
@GetMapping("/async")
public Object async() throws InterruptedException {
long begin = System.currentTimeMillis();
Future<String> future1 = asyncTask.test1();
Future<String> future2 = asyncTask.test2();
Future<String> future3 = asyncTask.test3();
Thread.sleep(2000);
while (true){
if (future1.isDone() & future2.isDone() & future3.isDone()) {
break; //异步接口内部都执行完毕,终止循环
}
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println("异步的总执行时间是:" + time);
return JsonData.buildSuccess(time); //这调用了Json工具类
}
}
二、日志管理
-
日志介绍
1.1、常用处理java的日志组件 slf4j,log4j,logback,common-logging 等
1.2、logBack是在log4j基础的改良,但不能单独使用,可配合slf4j使用
1.3、logBack核心对象
Logger: 日志记录器
Appender:指定日志输出目的地,可以是控制台或文件
Layout: 日志布局,用于格式化日志信息的输出
1.4、日志级别:debug<info<warn<error
1.5、 实例,见备注
1.6、Log4j日志转换为logBack在线工具(可以将log4j.properties文件内容转成logback.xml) 网址:https://logback.qos.ch/translator/log4j实例:
===========log4j示例===========
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=D://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =C://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
===========logback============
-
整合自定义logback
springboot整合logback参考文档:
https://docs.spring.io/spring-boot/docs/2.2.5.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-loggingLogBack官网:https://logback.qos.ch/manual/index.html 1、默认情况下,Spring Boot将日志输出到控制台,日志信息属于logBack 2、整合logBack 在工程的Resources中创建日志文件logback-spring.xml,官方推荐 -spring.xml结尾
logback-spring.xml文件:
<?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>