Skip to content

Commit 11615ad

Browse files
committed
匿名provider增加缓存,减少反射操作
1 parent 3dbb402 commit 11615ad

File tree

4 files changed

+65
-20
lines changed

4 files changed

+65
-20
lines changed

spring-boot-data-aggregator-core/src/main/java/io/github/lvyahui8/spring/aggregate/facade/impl/DataBeanAggregateQueryFacadeImpl.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
import io.github.lvyahui8.spring.aggregate.func.MultipleArgumentsFunction;
55
import io.github.lvyahui8.spring.aggregate.model.DataProvideDefinition;
66
import io.github.lvyahui8.spring.aggregate.service.DataBeanAggregateService;
7-
import io.github.lvyahui8.spring.aggregate.util.DefinitionUtils;
87
import org.springframework.util.Assert;
98

109
import java.lang.reflect.InvocationTargetException;
1110
import java.lang.reflect.Method;
12-
import java.lang.reflect.Modifier;
1311
import java.util.Collections;
1412
import java.util.Map;
1513

@@ -43,28 +41,12 @@ public <T> T get(Map<String, Object> invokeParams, MultipleArgumentsFunction<T>
4341

4442
@Override
4543
public <T> T get(Map<String, Object> invokeParams, MultipleArgumentsFunction<T> multipleArgumentsFunction, Long timeout) throws InterruptedException, IllegalAccessException, InvocationTargetException{
46-
Method[] methods = multipleArgumentsFunction.getClass().getMethods();
47-
Method applyMethod = null;
4844
if(invokeParams == null) {
4945
invokeParams = Collections.emptyMap();
5046
}
5147

52-
for (Method method : methods) {
53-
if(! Modifier.isStatic(method.getModifiers()) && ! method.isDefault()) {
54-
applyMethod = method;
55-
break;
56-
}
57-
}
58-
59-
if(applyMethod == null) {
60-
throw new IllegalAccessException(multipleArgumentsFunction.getClass().getName());
61-
}
62-
63-
64-
DataProvideDefinition provider = DefinitionUtils.getProvideDefinition(applyMethod);
65-
provider.setTimeout(timeout);
66-
provider.setTarget(multipleArgumentsFunction);
67-
48+
DataProvideDefinition provider = dataBeanAggregateService.getProvider(multipleArgumentsFunction);
49+
Method applyMethod = provider.getMethod();
6850
boolean accessible = applyMethod.isAccessible();
6951
if(! accessible) {
7052
applyMethod.setAccessible(true);

spring-boot-data-aggregator-core/src/main/java/io/github/lvyahui8/spring/aggregate/service/DataBeanAggregateService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.lvyahui8.spring.aggregate.service;
22

3+
import io.github.lvyahui8.spring.aggregate.func.MultipleArgumentsFunction;
34
import io.github.lvyahui8.spring.aggregate.model.DataProvideDefinition;
45

56
import java.lang.reflect.InvocationTargetException;
@@ -42,4 +43,12 @@ <T> T get(String id, Map<String,Object> invokeParams, Class<T> resultType)
4243
<T> T get(DataProvideDefinition provider, Map<String,Object> invokeParams, Class<T> resultType)
4344
throws InterruptedException, InvocationTargetException, IllegalAccessException;
4445

46+
/**
47+
* 通过MultipleArgumentsFunction获取provider实例
48+
*
49+
* @param function 多参函数
50+
* @return provider实例
51+
* @throws IllegalAccessException ignored
52+
*/
53+
DataProvideDefinition getProvider(MultipleArgumentsFunction<?> function) throws IllegalAccessException;
4554
}

spring-boot-data-aggregator-core/src/main/java/io/github/lvyahui8/spring/aggregate/service/impl/DataBeanAggregateServiceImpl.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import io.github.lvyahui8.spring.aggregate.config.RuntimeSettings;
44
import io.github.lvyahui8.spring.aggregate.consts.AggregationConstant;
55
import io.github.lvyahui8.spring.aggregate.context.AggregationContext;
6+
import io.github.lvyahui8.spring.aggregate.func.MultipleArgumentsFunction;
67
import io.github.lvyahui8.spring.aggregate.interceptor.AggregateQueryInterceptorChain;
78
import io.github.lvyahui8.spring.aggregate.model.*;
89
import io.github.lvyahui8.spring.aggregate.repository.DataProviderRepository;
910
import io.github.lvyahui8.spring.aggregate.service.AbstractAsyncQueryTask;
1011
import io.github.lvyahui8.spring.aggregate.service.AsyncQueryTaskWrapper;
1112
import io.github.lvyahui8.spring.aggregate.service.DataBeanAggregateService;
13+
import io.github.lvyahui8.spring.aggregate.util.DefinitionUtils;
1214
import lombok.Setter;
1315
import lombok.extern.slf4j.Slf4j;
1416
import org.springframework.context.ApplicationContext;
1517

1618
import java.lang.reflect.InvocationTargetException;
19+
import java.lang.reflect.Method;
20+
import java.lang.reflect.Modifier;
1721
import java.util.Collections;
1822
import java.util.HashMap;
1923
import java.util.List;
@@ -53,6 +57,34 @@ private AggregationContext initQueryContext(DataProvideDefinition rootProvider,
5357
return aggregationContext;
5458
}
5559

60+
@Override
61+
public DataProvideDefinition getProvider(MultipleArgumentsFunction<?> multipleArgumentsFunction) throws IllegalAccessException {
62+
DataProvideDefinition provider = repository.get(multipleArgumentsFunction.getClass().getName());
63+
if(provider != null) {
64+
return provider;
65+
}
66+
Method[] methods = multipleArgumentsFunction.getClass().getMethods();
67+
Method applyMethod = null;
68+
69+
70+
for (Method method : methods) {
71+
if(! Modifier.isStatic(method.getModifiers()) && ! method.isDefault()) {
72+
applyMethod = method;
73+
break;
74+
}
75+
}
76+
77+
if(applyMethod == null) {
78+
throw new IllegalAccessException(multipleArgumentsFunction.getClass().getName());
79+
}
80+
81+
provider = DefinitionUtils.getProvideDefinition(applyMethod);
82+
provider.setTarget(multipleArgumentsFunction);
83+
provider.setId(multipleArgumentsFunction.getClass().getName());
84+
repository.put(provider);
85+
return provider;
86+
}
87+
5688
@Override
5789
public <T> T get(String id, Map<String, Object> invokeParams, Class<T> resultType)
5890
throws InterruptedException, InvocationTargetException, IllegalAccessException {

spring-boot-data-aggregator-example/src/test/java/io/github/lvyahui8/spring/example/DataBeanAggregateQueryFacadeTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,4 +195,26 @@ public User apply(@DataConsumer("user") User user,
195195
Assert.isTrue(e instanceof IllegalArgumentException,"e must be typeof IllegalArgumentException");
196196
}
197197
}
198+
199+
@Test
200+
public void testAnonymousProviderCache() throws Exception {
201+
Function2<Category, List<String>, String> userFunction = new Function2<Category, List<String>, String>() {
202+
@Override
203+
public String apply(@DataConsumer("rootCategory") Category category,
204+
@DataConsumer("topCategoryNames") List<String> topCategoryNames) {
205+
return category.getName();
206+
}
207+
};
208+
Map<String, Object> map = Collections.singletonMap("userId", 1L);
209+
Exception exp = null;
210+
for (int i = 0; i < 1000; i ++) {
211+
try {
212+
String name = dataBeanAggregateQueryFacade.get(map,userFunction);
213+
} catch (Exception e) {
214+
exp = e;
215+
log.error("exp:" + e.getMessage());
216+
}
217+
}
218+
Assert.isNull(exp,"exp must be null!");
219+
}
198220
}

0 commit comments

Comments
 (0)