引入pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>order</artifactId><version>0.0.1-SNAPSHOT</version><name>order</name><description>order</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 添加MyBatisPlus的依賴 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4.1</version></dependency><!-- MySQL數據 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- druid 連接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.14</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.0</version></dependency><!--引入aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.order.OrderApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
yml配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/*.xml
server:port: 8082
spring:application:name: ordercloud:nacos:discovery:namespace: publicpassword: nacosserver-addr: localhost:8848username: nacosdatasource:driverClassName: com.mysql.cj.jdbc.Driverpassword: 123456type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/dmg1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: root
設置實體類
package com.example.order.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.util.Date;/*** 記錄接口超時*/
@Data
@TableName("timeout_log")
public class TimeOutLog {//主鍵@TableId(type = IdType.AUTO)private Long id;//請求方法private String requestMethod;//請求參數private String requestParams;//創建時間private Date createTime;//超時時間private Long time;
}
創建dao
package com.example.order.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.order.entity.TimeOutLog;public interface TimeOutLogMapper extends BaseMapper<TimeOutLog> {}
設置監聽類
package com.example.order.config;import com.alibaba.fastjson.JSONObject;
import com.example.order.entity.TimeOutLog;
import com.example.order.mapper.TimeOutLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Date;/*** 超時接口監聽 記錄到數據庫*/
@Slf4j
@Aspect
@Component
public class TimedOutListen {@Autowiredprivate TimeOutLogMapper timeOutLogMapper;/*** 環繞通知 監聽controller里面的接口超時* @param proceedingJoinPoint* @return* @throws Throwable*/@Around("execution(* com.example.order.controller.*.*(..))")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {//返回結果Object result = null;//開始時間long startTime = System.currentTimeMillis();try {//執行方法result = proceedingJoinPoint.proceed();return result;} catch (Throwable throwable) {throw throwable;} finally {//結束時間long endTime = System.currentTimeMillis();//如果大于3000毫秒那么就說明超時了if (endTime - startTime > 3000L) {//方法的名字String method=proceedingJoinPoint.getSignature().toShortString();//超時時間 毫秒long time=endTime-startTime;//請求參數String str= JSONObject.toJSONString(proceedingJoinPoint.getArgs());log.info("請求方法:{},超時時間:{},請求參數:{}",method,time,str);//把超時日志 記錄到數據庫中TimeOutLog bean=new TimeOutLog();bean.setTime(time);bean.setCreateTime(new Date());bean.setRequestMethod(method);bean.setRequestParams(str);timeOutLogMapper.insert(bean);//TODO 這時候 也可以設置發送短信 或者郵件的功能 通知程序員 去解決這個超時的問題}}}}
創建控制層
package com.example.order.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class OrderController {@GetMapping("/aa")public void aa(@RequestParam("name")String name){log.info("進入添加方法:{}",name);try {//阻塞4秒Thread.sleep(1000*4);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("添加完畢");}
}
啟動類
?
package com.example.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan(basePackages = {"com.example.order.mapper"})
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}
創建表
CREATE TABLE `timeout_log` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',`request_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '請求方法',`request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '請求參數',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`time` bigint DEFAULT NULL COMMENT '超時時間',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='接口超時日志表';
?
在瀏覽器訪問aa這個接口
可以看到超時的信息都記錄到數據庫中了
?