Skip to content

Commit 7846812

Browse files
committed
优化访问日志性能
1 parent 5f752c8 commit 7846812

File tree

6 files changed

+47
-22
lines changed

6 files changed

+47
-22
lines changed

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/AccessLoggerParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.lang.reflect.Method;
88

99
public interface AccessLoggerParser {
10-
boolean support(Class clazz, Method method);
10+
boolean support(Class<?> clazz, Method method);
1111

1212
LoggerDefine parse(MethodInterceptorHolder holder);
1313
}

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/DefaultAccessLoggerParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
public class DefaultAccessLoggerParser implements AccessLoggerParser {
1515
@Override
16-
public boolean support(Class clazz, Method method) {
16+
public boolean support(Class<?> clazz, Method method) {
1717
AccessLogger ann = AnnotationUtils.findAnnotation(method, AccessLogger.class);
1818
//注解了并且未取消
1919
return null != ann && !ann.ignore();

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/ReactiveAopAccessLoggerSupport.java

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.core.Ordered;
1717
import org.springframework.http.server.reactive.ServerHttpRequest;
1818
import org.springframework.util.ClassUtils;
19+
import org.springframework.util.ConcurrentReferenceHashMap;
1920
import org.springframework.web.server.ServerWebExchange;
2021
import org.springframework.web.server.WebFilter;
2122
import org.springframework.web.server.WebFilterChain;
@@ -41,6 +42,11 @@ public class ReactiveAopAccessLoggerSupport extends StaticMethodMatcherPointcutA
4142
@Autowired
4243
private ApplicationEventPublisher eventPublisher;
4344

45+
private final Map<Method, LoggerDefine> defineCache = new ConcurrentReferenceHashMap<>();
46+
47+
private static final LoggerDefine UNSUPPORTED = new LoggerDefine();
48+
49+
@SuppressWarnings("all")
4450
public ReactiveAopAccessLoggerSupport() {
4551
setAdvice((MethodInterceptor) methodInvocation -> {
4652
MethodInterceptorHolder methodInterceptorHolder = MethodInterceptorHolder.create(methodInvocation);
@@ -55,44 +61,61 @@ public ReactiveAopAccessLoggerSupport() {
5561
});
5662
}
5763

64+
private Mono<RequestInfo> currentRequestInfo() {
65+
return Mono
66+
.subscriberContext()
67+
.handle((context, sink) -> {
68+
if (context.hasKey(RequestInfo.class)) {
69+
RequestInfo info = context.get(RequestInfo.class);
70+
ReactiveLogger.log(context, info::setContext);
71+
sink.next(info);
72+
}
73+
});
74+
}
75+
5876
protected Flux<?> wrapFluxResponse(Flux<?> flux, AccessLoggerInfo loggerInfo) {
59-
return Mono.subscriberContext()
60-
.<RequestInfo>flatMap(ctx -> Mono.<RequestInfo>justOrEmpty(ctx.getOrEmpty(RequestInfo.class))
61-
.doOnNext(info -> ReactiveLogger.log(ctx, info::setContext)))
77+
return this
78+
.currentRequestInfo()
6279
.doOnNext(loggerInfo::putAccessInfo)
6380
.thenMany(flux)
6481
.doOnError(loggerInfo::setException)
6582
.doFinally(f -> {
6683
loggerInfo.setResponseTime(System.currentTimeMillis());
6784
eventPublisher.publishEvent(new AccessLoggerAfterEvent(loggerInfo));
68-
}).subscriberContext(ReactiveLogger.start("accessLogId", loggerInfo.getId()));
85+
})
86+
.subscriberContext(ReactiveLogger.start("accessLogId", loggerInfo.getId()));
6987
}
7088

7189
protected Mono<?> wrapMonoResponse(Mono<?> mono, AccessLoggerInfo loggerInfo) {
72-
return Mono.subscriberContext()
73-
.<RequestInfo>flatMap(ctx -> Mono.<RequestInfo>justOrEmpty(ctx.getOrEmpty(RequestInfo.class))
74-
.doOnNext(info -> ReactiveLogger.log(ctx, info::setContext)))
90+
return this
91+
.currentRequestInfo()
7592
.doOnNext(loggerInfo::putAccessInfo)
7693
.then(mono)
7794
.doOnError(loggerInfo::setException)
7895
.doOnSuccess(loggerInfo::setResponse)
7996
.doFinally(f -> {
8097
loggerInfo.setResponseTime(System.currentTimeMillis());
8198
eventPublisher.publishEvent(new AccessLoggerAfterEvent(loggerInfo));
82-
}).subscriberContext(ReactiveLogger.start("accessLogId", loggerInfo.getId()));
99+
})
100+
.subscriberContext(ReactiveLogger.start("accessLogId", loggerInfo.getId()));
101+
}
102+
103+
private LoggerDefine createDefine(MethodInterceptorHolder holder) {
104+
return loggerParsers
105+
.stream()
106+
.filter(parser -> parser.support(ClassUtils.getUserClass(holder.getTarget()), holder.getMethod()))
107+
.findAny()
108+
.map(parser -> parser.parse(holder))
109+
.orElse(UNSUPPORTED);
83110
}
84111

85112
@SuppressWarnings("all")
86113
protected AccessLoggerInfo createLogger(MethodInterceptorHolder holder) {
87114
AccessLoggerInfo info = new AccessLoggerInfo();
88115
info.setId(IDGenerator.MD5.generate());
89-
90116
info.setRequestTime(System.currentTimeMillis());
91-
LoggerDefine define = loggerParsers.stream()
92-
.filter(parser -> parser.support(ClassUtils.getUserClass(holder.getTarget()), holder.getMethod()))
93-
.findAny()
94-
.map(parser -> parser.parse(holder))
95-
.orElse(null);
117+
118+
LoggerDefine define = defineCache.computeIfAbsent(holder.getMethod(), method -> createDefine(holder));
96119

97120
if (define != null) {
98121
info.setAction(define.getAction());
@@ -113,14 +136,14 @@ protected AccessLoggerInfo createLogger(MethodInterceptorHolder holder) {
113136
continue;
114137
}
115138
if (val instanceof Mono) {
116-
args[i] = ((Mono) val)
139+
args[i] = ((Mono<?>) val)
117140
.doOnNext(param -> {
118141
value.put(name, param);
119142
});
120143
} else if (val instanceof Flux) {
121144
List<Object> arr = new ArrayList<>();
122145
value.put(name, arr);
123-
args[i] = ((Flux) val)
146+
args[i] = ((Flux<?>) val)
124147
.doOnNext(param -> {
125148
arr.add(param);
126149
});
@@ -143,7 +166,9 @@ public int getOrder() {
143166

144167
@Override
145168
public boolean matches(Method method, Class<?> aClass) {
146-
return loggerParsers.stream().anyMatch(parser -> parser.support(aClass, method));
169+
return loggerParsers
170+
.stream()
171+
.anyMatch(parser -> parser.support(aClass, method));
147172
}
148173

149174
@Override

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/ResourceAccessLoggerParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class ResourceAccessLoggerParser implements AccessLoggerParser {
2222
));
2323

2424
@Override
25-
public boolean support(Class clazz, Method method) {
25+
public boolean support(Class<?> clazz, Method method) {
2626
Set<Annotation> a1 = AnnotatedElementUtils.findAllMergedAnnotations(method, annotations);
2727
Set<Annotation> a2 = AnnotatedElementUtils.findAllMergedAnnotations(clazz, annotations);
2828

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/Swagger3AccessLoggerParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
public class Swagger3AccessLoggerParser implements AccessLoggerParser {
1414
@Override
15-
public boolean support(Class clazz, Method method) {
15+
public boolean support(Class<?> clazz, Method method) {
1616

1717
Tag api = AnnotationUtils.findAnnotation(clazz, Tag.class);
1818
Operation operation = AnnotationUtils.findAnnotation(method, Operation.class);

hsweb-logging/hsweb-access-logging-aop/src/main/java/org/hswebframework/web/logging/aop/SwaggerAccessLoggerParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
public class SwaggerAccessLoggerParser implements AccessLoggerParser {
1313
@Override
14-
public boolean support(Class clazz, Method method) {
14+
public boolean support(Class<?> clazz, Method method) {
1515

1616
Api api = AnnotationUtils.findAnnotation(clazz, Api.class);
1717
ApiOperation operation = AnnotationUtils.findAnnotation(method, ApiOperation.class);

0 commit comments

Comments
 (0)