Skip to content

Commit 205da08

Browse files
committed
Optimize annotations and configuration
1 parent 53c7ef5 commit 205da08

File tree

8 files changed

+117
-29
lines changed

8 files changed

+117
-29
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.github.lvyahui8.spring.annotation;
22

3+
import org.springframework.core.annotation.AliasFor;
4+
35
import java.lang.annotation.*;
46

57
/**
6-
* 数据依赖项
8+
* 数据依赖项 Data consumer
79
*
810
* @author lvyahui (lvyahui8@gmail.com,lvyahui8@126.com)
911
* @since 2019/6/1 0:05
@@ -12,5 +14,15 @@
1214
@Retention(RetentionPolicy.RUNTIME)
1315
@Documented
1416
public @interface DataConsumer {
15-
String id();
17+
/**
18+
* Unique identifier of the data
19+
*/
20+
@AliasFor("value")
21+
String id() default "";
22+
23+
/**
24+
* Same as id();
25+
*/
26+
@AliasFor("id")
27+
String value() default "";
1628
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.github.lvyahui8.spring.annotation;
22

3+
import org.springframework.core.annotation.AliasFor;
4+
35
import java.lang.annotation.*;
46

57
/**
6-
* 数据提供者
8+
* 数据提供者 Data provider
79
*
810
* @author lvyahui (lvyahui8@gmail.com,lvyahui8@126.com)
911
* @since 2019/6/1 0:05
@@ -12,6 +14,21 @@
1214
@Retention(RetentionPolicy.RUNTIME)
1315
@Documented
1416
public @interface DataProvider {
15-
String id();
16-
long timeout() default 10000;
17+
18+
/**
19+
* Unique identifier of the data
20+
*/
21+
@AliasFor("value")
22+
String id() default "";
23+
24+
/**
25+
* Same as id()
26+
*/
27+
@AliasFor("id")
28+
String value() default "";
29+
30+
/**
31+
* Asynchronous execution method timeout
32+
*/
33+
long timeout() default -1;
1734
}

spring-boot-data-aggregator-autoconfigure/src/main/java/io/github/lvyahui8/spring/annotation/InvokeParameter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,8 @@
1212
@Retention(RetentionPolicy.RUNTIME)
1313
@Documented
1414
public @interface InvokeParameter {
15+
/**
16+
* Manually passed parameter key
17+
*/
1518
String value();
1619
}

spring-boot-data-aggregator-autoconfigure/src/main/java/io/github/lvyahui8/spring/autoconfigure/BeanAggregateAutoConfiguration.java

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.lvyahui8.spring.autoconfigure;
22

3+
import io.github.lvyahui8.spring.aggregate.config.RuntimeSettings;
34
import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
45
import io.github.lvyahui8.spring.aggregate.facade.impl.DataBeanAggregateQueryFacadeImpl;
56
import io.github.lvyahui8.spring.aggregate.model.*;
@@ -20,7 +21,10 @@
2021
import org.springframework.context.ApplicationContextAware;
2122
import org.springframework.context.annotation.Bean;
2223
import org.springframework.context.annotation.Configuration;
24+
import org.springframework.core.annotation.AnnotationUtils;
2325
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
26+
import org.springframework.util.Assert;
27+
import org.springframework.util.StringUtils;
2428

2529
import java.lang.reflect.Method;
2630
import java.lang.reflect.Parameter;
@@ -56,6 +60,7 @@ public DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade() {
5660
DataProviderRepository repository = new DataProviderRepositoryImpl();
5761
scanProviders(repository);
5862
DataBeanAgregateQueryServiceImpl service = new DataBeanAgregateQueryServiceImpl(repository);
63+
service.setRuntimeSettings(createRuntimeSettings());
5964
service.setExecutorService(aggregateExecutorService());
6065
service.setApplicationContext(applicationContext);
6166
return new DataBeanAggregateQueryFacadeImpl(service);
@@ -64,13 +69,12 @@ public DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade() {
6469
@Bean(name = "aggregateExecutorService")
6570
@ConditionalOnMissingBean(name = "aggregateExecutorService")
6671
public ExecutorService aggregateExecutorService() {
67-
log.info("create a ThreadPoolExecutor");
6872
return new ThreadPoolExecutor(
69-
4,
70-
properties.getThreadNumber() < 4 ? 4 : properties.getThreadNumber() ,
73+
properties.getThreadNumber(),
74+
properties.getThreadNumber() ,
7175
2L, TimeUnit.HOURS,
7276
new LinkedBlockingDeque<>(properties.getQueueSize()),
73-
new CustomizableThreadFactory("aggregateTask-"));
77+
new CustomizableThreadFactory(properties.getThreadPrefix()));
7478
}
7579

7680
private void scanProviders(DataProviderRepository repository) {
@@ -87,10 +91,12 @@ private void scanProviders(DataProviderRepository repository) {
8791

8892
private void dealProvideMethod(DataProviderRepository repository, Method method) {
8993
DataProvideDefination provider = new DataProvideDefination();
90-
DataProvider beanProvider = method.getAnnotation(DataProvider.class);
91-
provider.setId(beanProvider.id());
94+
DataProvider beanProvider = AnnotationUtils.findAnnotation(method, DataProvider.class);
95+
String dataId = beanProvider.id();
96+
Assert.isTrue(! StringUtils.isEmpty(dataId),"data id must be not null!");
97+
provider.setId(dataId);
9298
provider.setMethod(method);
93-
provider.setTimeout(beanProvider.timeout());
99+
provider.setTimeout(beanProvider.timeout() > 0 ? beanProvider.timeout() : properties.getDefaultTimeout());
94100
Parameter[] parameters = provider.getMethod().getParameters();
95101
List<MethodArg> methodArgs = new ArrayList<>(method.getParameterCount());
96102
provider.setDepends(new ArrayList<>(method.getParameterCount()));
@@ -99,31 +105,40 @@ private void dealProvideMethod(DataProviderRepository repository, Method method)
99105
dealMethodParamter(provider, methodArgs, parameter);
100106
}
101107
provider.setMethodArgs(methodArgs);
102-
repository.put(beanProvider.id(),provider);
108+
repository.put(dataId,provider);
103109
}
104110

105111
private void dealMethodParamter(DataProvideDefination provideDefination, List<MethodArg> methodArgs, Parameter parameter) {
112+
DataConsumer dataConsumer = AnnotationUtils.findAnnotation(parameter, DataConsumer.class);
113+
InvokeParameter invokeParameter = AnnotationUtils.findAnnotation(parameter,InvokeParameter.class);
114+
Assert.isTrue(dataConsumer != null || invokeParameter != null,
115+
"Parameters must be added @InvokeParameter or @DataConsumer annotation");
106116
MethodArg methodArg = new MethodArg();
107-
DataConsumer bean = parameter.getAnnotation(DataConsumer.class);
108-
InvokeParameter invokeParameter = parameter.getAnnotation(InvokeParameter.class);
109-
if(bean != null) {
110-
methodArg.setAnnotionKey(bean.id());
117+
if(dataConsumer != null) {
118+
String dataId = dataConsumer.id();
119+
Assert.isTrue(! StringUtils.isEmpty(dataId),"data id must be not null!");
120+
methodArg.setAnnotionKey(dataId);
111121
methodArg.setDenpendType(DenpendType.OTHER_MODEL);
112122
DataConsumeDefination dataConsumeDefination = new DataConsumeDefination();
113123
dataConsumeDefination.setClazz(parameter.getType());
114-
dataConsumeDefination.setId(bean.id());
124+
dataConsumeDefination.setId(dataId);
115125
provideDefination.getDepends().add(dataConsumeDefination);
116-
} else if (invokeParameter != null){
126+
} else {
117127
methodArg.setAnnotionKey(invokeParameter.value());
118128
methodArg.setDenpendType(DenpendType.INVOKE_PARAM);
119129
InvokeParameterDefination parameterDefination = new InvokeParameterDefination();
120130
parameterDefination.setKey(invokeParameter.value());
121131
provideDefination.getParams().add(parameterDefination);
122-
} else {
123-
throw new IllegalArgumentException(
124-
"paramter must ananotion by InvokeParameter or DataConsumer");
125132
}
126133
methodArg.setParameter(parameter);
127134
methodArgs.add(methodArg);
128135
}
136+
137+
private RuntimeSettings createRuntimeSettings() {
138+
RuntimeSettings runtimeSettings = new RuntimeSettings();
139+
runtimeSettings.setEnableLogging(properties.getEnableLogging() != null
140+
? properties.getEnableLogging() : false);
141+
return runtimeSettings;
142+
}
143+
129144
}

spring-boot-data-aggregator-autoconfigure/src/main/java/io/github/lvyahui8/spring/autoconfigure/BeanAggregateProperties.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,28 @@
1010
@ConfigurationProperties(prefix = "io.github.lvyahui8.spring")
1111
@Data
1212
public class BeanAggregateProperties {
13-
private String [] basePackages;
14-
private int threadNumber = Runtime.getRuntime().availableProcessors() * 3 ;
15-
private int queueSize = 1000;
13+
/**
14+
* Packages that need to scan for aggregated annotations
15+
*/
16+
private String[] basePackages;
17+
/**
18+
* Thread name prefix for asynchronous threads
19+
*/
20+
private String threadPrefix = "aggregateTask-";
21+
/**
22+
* Thread size of the asynchronous thread pool
23+
*/
24+
private int threadNumber = Runtime.getRuntime().availableProcessors() * 3;
25+
/**
26+
* The size of the queue that holds the task to be executed
27+
*/
28+
private int queueSize = 1000;
29+
/**
30+
* Set a default timeout for the method of providing data
31+
*/
32+
private Long defaultTimeout = 3000L;
33+
/**
34+
* Allow output log
35+
*/
36+
private Boolean enableLogging = true;
1637
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.lvyahui8.spring.aggregate.config;
2+
3+
import lombok.Data;
4+
5+
/**
6+
* @author lvyahui (lvyahui8@gmail.com,lvyahui8@126.com)
7+
* @since 2019/6/15 2:46
8+
*/
9+
@Data
10+
public class RuntimeSettings {
11+
private boolean enableLogging;
12+
}

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

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

3+
import io.github.lvyahui8.spring.aggregate.config.RuntimeSettings;
34
import io.github.lvyahui8.spring.aggregate.model.DataConsumeDefination;
45
import io.github.lvyahui8.spring.aggregate.model.DataProvideDefination;
56
import io.github.lvyahui8.spring.aggregate.model.DenpendType;
@@ -31,6 +32,9 @@ public class DataBeanAgregateQueryServiceImpl implements DataBeanAgregateQuerySe
3132
@Setter
3233
private ExecutorService executorService;
3334

35+
@Setter
36+
private RuntimeSettings runtimeSettings;
37+
3438
public DataBeanAgregateQueryServiceImpl(DataProviderRepository repository) {
3539
this.repository = repository;
3640
}
@@ -86,7 +90,12 @@ public <T> T get(String id, Map<String, Object> invokeParams, Class<T> resultTyp
8690

8791
T result = resultType.cast(provider.getMethod()
8892
.invoke(applicationContext.getBean(provider.getMethod().getDeclaringClass()), args));
89-
if (log.isInfoEnabled()) {
93+
logging(id, startTime, provider);
94+
return result;
95+
}
96+
97+
private void logging(String id, long startTime, DataProvideDefination provider) {
98+
if (runtimeSettings.isEnableLogging() && log.isInfoEnabled()) {
9099
log.info("query id: {}, " +
91100
"costTime: {}ms, " +
92101
"resultType: {}, " +
@@ -97,7 +106,6 @@ public <T> T get(String id, Map<String, Object> invokeParams, Class<T> resultTyp
97106
provider.getMethod().getDeclaringClass().getSimpleName() + "#" + provider.getMethod().getName()
98107
);
99108
}
100-
return result;
101109
}
102110

103111
}

spring-boot-data-aggregator-example/src/main/java/io/github/lvyahui8/spring/example/aggregate/UserAggregate.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
*/
1515
@Component
1616
public class UserAggregate {
17-
@DataProvider(id="userWithPosts")
17+
@DataProvider("userWithPosts")
1818
public User userWithPosts(
1919
@DataConsumer(id = "user") User user,
20-
@DataConsumer(id = "posts") List<Post> posts) {
20+
@DataConsumer("posts") List<Post> posts) {
2121
user.setPosts(posts);
2222
return user;
2323
}

0 commit comments

Comments
 (0)