├── .gitignore
├── data-aggregate-core
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── github
│ │ └── middleware
│ │ └── aggregate
│ │ ├── annonation
│ │ ├── AggregeBatchProxy.java
│ │ ├── AggregeEnable.java
│ │ ├── AggregeField.java
│ │ ├── AggregeProxy.java
│ │ └── AggregeProxyArg.java
│ │ ├── config
│ │ └── MergeProperties.java
│ │ ├── constant
│ │ └── ArgGetMode.java
│ │ ├── context
│ │ ├── AggregeContext.java
│ │ ├── AggregeEvent.java
│ │ ├── AggregeListener.java
│ │ ├── container
│ │ │ ├── StartedAggregeEvent.java
│ │ │ ├── StartedAggregeListener.java
│ │ │ ├── StopAggregeEvent.java
│ │ │ └── StopAggregeListener.java
│ │ └── session
│ │ │ ├── BreakDataBindAggregeEvent.java
│ │ │ ├── BreakDataBindAggregeEventListener.java
│ │ │ ├── ContractInvokeAfterAggregeEvent.java
│ │ │ ├── ContractInvokeAfterAggregeListener.java
│ │ │ ├── ContractInvokeBeforeAggregeEvent.java
│ │ │ ├── ContractInvokeBeforeAggregeListener.java
│ │ │ ├── DataBindBeforeAggregeEvent.java
│ │ │ ├── DataBindBeforeAggregeListener.java
│ │ │ ├── InterceptorAfterAggregeEvent.java
│ │ │ ├── InterceptorAfterAggregeListener.java
│ │ │ ├── InterceptorBeforeAggregeEvent.java
│ │ │ └── InterceptorBeforeAggregeListener.java
│ │ ├── contract
│ │ ├── ResponseResolver.java
│ │ ├── ServiceConsumerEndpoint.java
│ │ └── support
│ │ │ ├── NothingResponseResolver.java
│ │ │ └── Proxys.java
│ │ ├── core
│ │ ├── AggregeEngine.java
│ │ ├── AggregeEngineActivetor.java
│ │ ├── AggregeException.java
│ │ ├── ExtensionLoader.java
│ │ ├── LasyLoadData.java
│ │ ├── RequestPayLoad.java
│ │ └── support
│ │ │ ├── AbstractAggregeEngineActivetor.java
│ │ │ ├── AggregeEngineActivetorFactory.java
│ │ │ ├── AggregeEngineActivetors.java
│ │ │ ├── DefaultAggregeEngine.java
│ │ │ ├── DefaultAggregeEngineActivetor.java
│ │ │ ├── DefaultExtensionLoader.java
│ │ │ ├── ExtensionLoaders.java
│ │ │ └── GenClzProxyAggregeEngineActivetor.java
│ │ ├── flow
│ │ ├── ItemBinder.java
│ │ ├── ItemCommand.java
│ │ ├── ItemInterceptor.java
│ │ ├── ItemOrder.java
│ │ ├── builder
│ │ │ ├── ItemBinderChain.java
│ │ │ └── Steps.java
│ │ ├── context
│ │ │ └── Invocation.java
│ │ └── support
│ │ │ ├── AbstractItemCommand.java
│ │ │ ├── ItemProxyArgBuildCommand.java
│ │ │ ├── ItemProxyFetchDataCommand.java
│ │ │ ├── ItemProxyResponseResolverCommand.java
│ │ │ ├── ItemRequestValidateCommand.java
│ │ │ ├── ItemResponseCommand.java
│ │ │ ├── ItemsProxyArgBuildCommand.java
│ │ │ └── ItemsProxyFetchDataCommand.java
│ │ ├── source
│ │ ├── MetaHolderFactory.java
│ │ ├── bean
│ │ │ ├── FieldVisitor.java
│ │ │ ├── MetaHolder.java
│ │ │ └── MethodVisitor.java
│ │ └── support
│ │ │ ├── BeanPropertyLoaders.java
│ │ │ └── ReflectMetaHolderFactory.java
│ │ └── util
│ │ ├── ArrayUtils.java
│ │ ├── AsyncUtils.java
│ │ ├── Reflections.java
│ │ ├── RegexMatcher.java
│ │ └── UnsafeUtils.java
│ └── resources
│ ├── META-INF
│ └── services
│ │ ├── com.github.middleware.aggregate.context.AggregeListener
│ │ ├── com.github.middleware.aggregate.core.AggregeEngine
│ │ ├── com.github.middleware.aggregate.flow.ItemBinder
│ │ └── com.github.middleware.aggregate.source.MetaHolderFactory
│ └── data-aggrege-demo.yml
├── data-aggregate-spring-boot-starter
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── github
│ └── middleware
│ └── aggregate
│ └── spring
│ └── boot
│ └── autoconfigure
│ ├── AggregateAutoConfiguration.java
│ ├── AggregateProperties.java
│ └── EnableDataAggregate.java
├── data-aggregate-spring
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── github
│ │ │ └── middleware
│ │ │ └── aggregate
│ │ │ └── spring
│ │ │ ├── init
│ │ │ ├── DataAggregeAspect.java
│ │ │ └── SpringContextHolder.java
│ │ │ ├── remote
│ │ │ └── SpringContractBeanEndpoint.java
│ │ │ └── util
│ │ │ └── AopUtils.java
│ └── resources
│ │ └── META-INF
│ │ └── services
│ │ └── com.github.middleware.aggregate.contract.ServiceConsumerEndpoint
│ └── test
│ ├── java
│ └── com
│ │ └── github
│ │ └── middleware
│ │ └── aggregate
│ │ ├── QuickStart_test.java
│ │ └── example
│ │ ├── AddressRepository.java
│ │ ├── AddressResponseResolver.java
│ │ ├── GlobalDictionaryCode.java
│ │ ├── OrderService.java
│ │ ├── ProductService.java
│ │ └── domain
│ │ ├── Address.java
│ │ ├── Order.java
│ │ ├── Order2.java
│ │ └── Product.java
│ └── resources
│ ├── data-aggrege.yml
│ ├── logback.xml
│ ├── mock
│ └── config.json
│ └── spring.xml
├── pom.xml
└── readme.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 |
17 | # Windows shortcuts
18 | *.lnk
19 |
20 | # =========================
21 | # Operating System Files
22 | # =========================
23 |
24 | # OSX
25 | # =========================
26 |
27 | .DS_Store
28 | .AppleDouble
29 | .LSOverride
30 |
31 | # Thumbnails
32 | ._*
33 |
34 | # Files that might appear in the root of a volume
35 | .DocumentRevisions-V100
36 | .fseventsd
37 | .Spotlight-V100
38 | .TemporaryItems
39 | .Trashes
40 | .VolumeIcon.icns
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
49 |
50 |
51 | #my
52 | /target/
53 | /.classpath
54 | /.settings
55 | /.project
56 | /.idea
57 | *.iml
58 | /.springBeans
--------------------------------------------------------------------------------
/data-aggregate-core/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 | data-aggregate-parent
7 | com.github.middleware
8 | 1.0
9 |
10 | 4.0.0
11 | ${aggregate.verion}
12 | data-aggregate-core
13 |
14 | data-aggregate-core
15 | http://www.example.com
16 |
17 |
18 | com.google.guava
19 | guava
20 |
21 |
22 | org.yaml
23 | snakeyaml
24 |
25 |
26 | org.springframework
27 | spring-core
28 |
29 |
30 | org.slf4j
31 | slf4j-api
32 |
33 |
34 | io.reactivex.rxjava2
35 | rxjava
36 |
37 |
38 | cglib
39 | cglib
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/annonation/AggregeBatchProxy.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.annonation;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/2/14.
9 | */
10 | @Target(ElementType.TYPE)
11 | @Retention(RetentionPolicy.RUNTIME)
12 | @Documented
13 | public @interface AggregeBatchProxy {
14 | /**
15 | * @return
16 | */
17 | AggregeProxy list() default @AggregeProxy(enable = false);
18 |
19 | /**
20 | *
21 | * @return
22 | */
23 | AggregeProxy item() default @AggregeProxy(enable = false);
24 | }
25 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/annonation/AggregeEnable.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.annonation;
2 |
3 |
4 | import java.lang.annotation.*;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description:
9 | * @Date: created in 2019/1/7.
10 | */
11 | @Target(value = {ElementType.METHOD})
12 | @Retention(RetentionPolicy.RUNTIME)
13 | @Documented
14 | public @interface AggregeEnable {
15 | /**
16 | * 开启并行填充
17 | *
18 | * @return
19 | */
20 | boolean parallel() default false;
21 | }
22 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/annonation/AggregeField.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.annonation;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/1/7.
9 | */
10 | @Target(value = {ElementType.FIELD})
11 | @Retention(RetentionPolicy.RUNTIME)
12 | @Documented
13 | public @interface AggregeField {
14 | /**
15 | * 远程或本地服务,服务于单VO
16 | *
17 | * @return
18 | */
19 | AggregeProxy proxy() default @AggregeProxy(enable = false);
20 |
21 | /**
22 | * 开启性能优化(批量问题),执行顺序是batchProxy->proxy
23 | *
24 | * @return
25 | */
26 | AggregeBatchProxy batchProxy() default @AggregeBatchProxy;
27 |
28 | /**
29 | * 是否忽略错误
30 | *
31 | * @return
32 | */
33 | boolean ignoreError() default false;
34 | }
35 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/annonation/AggregeProxy.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.annonation;
2 |
3 | import com.github.middleware.aggregate.contract.ResponseResolver;
4 | import com.github.middleware.aggregate.contract.support.NothingResponseResolver;
5 |
6 | import java.lang.annotation.*;
7 |
8 | /**
9 | * @Author: alex
10 | * @Description:
11 | * @Date: created in 2019/1/7.
12 | */
13 | @Target(ElementType.TYPE)
14 | @Retention(RetentionPolicy.RUNTIME)
15 | @Documented
16 | public @interface AggregeProxy {
17 | /**
18 | * 是否启用
19 | *
20 | * @return
21 | */
22 | boolean enable() default true;
23 |
24 | /**
25 | * 目标服务名
26 | * 名称以#开头,代表从当前IOC中获取,否则类全名,如下:
27 | * #omsProductServcie
28 | * com.github.oms.contract.ProductServcie
29 | *
30 | * @return
31 | */
32 | String name() default "";
33 |
34 | /**
35 | * 调用方法
36 | *
37 | * @return
38 | */
39 | String method() default "";
40 |
41 | /**
42 | * 查询值
43 | *
44 | * @return
45 | */
46 | AggregeProxyArg[] params() default {};
47 |
48 | /**
49 | * 是否缓存
50 | * @deprecated (不需要)
51 | * @return
52 | */
53 | @Deprecated
54 | boolean cache() default false;
55 |
56 | /**
57 | * @return
58 | */
59 | Class extends ResponseResolver> resolver() default NothingResponseResolver.class;
60 | }
61 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/annonation/AggregeProxyArg.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.annonation;
2 |
3 | import com.github.middleware.aggregate.constant.ArgGetMode;
4 |
5 | import java.lang.annotation.*;
6 |
7 | /**
8 | * @Author: alex
9 | * @Description:
10 | * @Date: created in 2019/1/7.
11 | */
12 | @Target(ElementType.TYPE)
13 | @Retention(RetentionPolicy.RUNTIME)
14 | @Documented
15 | public @interface AggregeProxyArg {
16 | /**
17 | * 参数获取模式
18 | *
19 | * @return
20 | */
21 | ArgGetMode argGetMode() default ArgGetMode.ITEM;
22 |
23 | /**
24 | * @deprecated (contract的参数名)
25 | *
26 | * @return
27 | */
28 | @Deprecated
29 | String paramName() default "";
30 |
31 | /**
32 | * @return
33 | */
34 | String paramValue() default "";
35 |
36 | /**
37 | * 为vo的属性名或session中的key
38 | *
39 | * @return
40 | */
41 | String key() default "";
42 | }
43 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/config/MergeProperties.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.config;
2 |
3 | /**
4 | * @Author: alex
5 | * @Description: 全局配置
6 | * @Date: created in 2019/1/18.
7 | */
8 | public class MergeProperties {
9 | private Integer clzMetasCacheSize;
10 | private Integer responseResolverCacheSize;
11 | private Integer proxyMethodCacheSize;
12 | private Integer corePoolSize;
13 | /**
14 | * 秒
15 | */
16 | private Integer keepAliveTime = 300;
17 | private Integer workQueueSize = 500;
18 |
19 | public MergeProperties() {
20 | corePoolSize = Runtime.getRuntime().availableProcessors();
21 | }
22 |
23 | /**
24 | * 异步获取结果时最大阻塞时间(默认:20秒)
25 | */
26 | private Integer maxBlockTimeout = 20000;
27 |
28 | private String[] scanPackages;
29 |
30 | public Integer getClzMetasCacheSize() {
31 | return clzMetasCacheSize;
32 | }
33 |
34 | public void setClzMetasCacheSize(Integer clzMetasCacheSize) {
35 | this.clzMetasCacheSize = clzMetasCacheSize;
36 | }
37 |
38 | public Integer getResponseResolverCacheSize() {
39 | return responseResolverCacheSize;
40 | }
41 |
42 | public void setResponseResolverCacheSize(Integer responseResolverCacheSize) {
43 | this.responseResolverCacheSize = responseResolverCacheSize;
44 | }
45 |
46 | public Integer getProxyMethodCacheSize() {
47 | return proxyMethodCacheSize;
48 | }
49 |
50 | public void setProxyMethodCacheSize(Integer proxyMethodCacheSize) {
51 | this.proxyMethodCacheSize = proxyMethodCacheSize;
52 | }
53 | public String[] getScanPackages() {
54 | return scanPackages;
55 | }
56 |
57 | public void setScanPackages(String[] scanPackages) {
58 | this.scanPackages = scanPackages;
59 | }
60 |
61 | public Integer getMaxBlockTimeout() {
62 | return maxBlockTimeout;
63 | }
64 |
65 | public void setMaxBlockTimeout(Integer maxBlockTimeout) {
66 | this.maxBlockTimeout = maxBlockTimeout;
67 | }
68 |
69 | public Integer getCorePoolSize() {
70 | return corePoolSize;
71 | }
72 |
73 | public void setCorePoolSize(Integer corePoolSize) {
74 | this.corePoolSize = corePoolSize;
75 | }
76 |
77 | public Integer getKeepAliveTime() {
78 | return keepAliveTime;
79 | }
80 |
81 | public void setKeepAliveTime(Integer keepAliveTime) {
82 | this.keepAliveTime = keepAliveTime;
83 | }
84 |
85 | public Integer getWorkQueueSize() {
86 | return workQueueSize;
87 | }
88 |
89 | public void setWorkQueueSize(Integer workQueueSize) {
90 | this.workQueueSize = workQueueSize;
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/constant/ArgGetMode.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.constant;
2 |
3 | /**
4 | * @Author: alex
5 | * @Description:
6 | * @Date: created in 2019/1/10.
7 | */
8 | public enum ArgGetMode {
9 |
10 | /**
11 | * 从当前VO中获取
12 | */
13 | ITEM,
14 | /**
15 | * 从session中获取
16 | */
17 | SESSION,
18 | /**
19 | * 从batch中获取
20 | */
21 | BATCH
22 | }
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/AggregeContext.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description: 它主要服务于客户接入端与本组件的交互,致力于解决参数传递问题:
9 | * 1.支持从item(DataVo)中提取属性
10 | * 2.支持复杂参数(item中可能不存在的)从session(ThreadLocal)中获取
11 | * @Date: created in 2019/1/14.
12 | */
13 | public class AggregeContext {
14 | private static final ThreadLocal LOCAL =ThreadLocal.withInitial(AggregeContext::new);
15 | /**
16 | * prxoy(contract)所需的参数
17 | */
18 | private final Map attachments = new HashMap();
19 | /**
20 | * 触发源
21 | */
22 | private String fireSource;
23 |
24 | public static AggregeContext getContext() {
25 | return LOCAL.get();
26 | }
27 |
28 | public static void removeContext() {
29 | LOCAL.remove();
30 | }
31 |
32 | public Object getAttachment(String key) {
33 | return this.attachments.get(key);
34 | }
35 |
36 | public AggregeContext setAttachment(String key, Object value) {
37 | if (value == null) {
38 | this.attachments.remove(key);
39 | } else {
40 | this.attachments.put(key, value);
41 | }
42 | return this;
43 | }
44 |
45 | public AggregeContext setAttachments(Map attachment) {
46 | this.attachments.clear();
47 | if (attachment != null && attachment.size() > 0) {
48 | this.attachments.putAll(attachment);
49 | }
50 | return this;
51 | }
52 |
53 | public String getFireSource() {
54 | return fireSource;
55 | }
56 |
57 | public void setFireSource(String fireSource) {
58 | this.fireSource = fireSource;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/AggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context;
2 |
3 | import java.util.Date;
4 | import java.util.EventObject;
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/1/17.
9 | */
10 | public abstract class AggregeEvent extends EventObject {
11 | private final Date time;
12 |
13 | public AggregeEvent(Object source) {
14 | super(source);
15 | this.time = new Date();
16 | }
17 |
18 | public Date getTime() {
19 | return this.time;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/AggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context;
2 | /**
3 | * @Author: alex
4 | * @Description:
5 | * @Date: created in 2019/1/17.
6 | */
7 | public interface AggregeListener {
8 | void lister(T event);
9 | }
10 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/container/StartedAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.container;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: AggregeEngine.start,容器级事件
8 | * @Date: created in 2019/1/17.
9 | */
10 | public class StartedAggregeEvent extends AggregeEvent {
11 | public StartedAggregeEvent(Object source) {
12 | super(source);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/container/StartedAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.container;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.google.common.eventbus.Subscribe;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | /**
9 | * @Author: alex
10 | * @Description:
11 | * @Date: created in 2019/1/17.
12 | */
13 | public class StartedAggregeListener implements AggregeListener {
14 | private static final Logger LOGGER = LoggerFactory.getLogger(StartedAggregeListener.class);
15 |
16 | @Subscribe
17 | @Override
18 | public void lister(StartedAggregeEvent event) {
19 | if (LOGGER.isDebugEnabled()) LOGGER.debug("Started");
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/container/StopAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.container;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: AggregeEngine.stop 容器级事件
8 | * @Date: created in 2019/1/17.
9 | */
10 | public class StopAggregeEvent extends AggregeEvent {
11 | public StopAggregeEvent(Object source) {
12 | super(source);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/container/StopAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.container;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.google.common.eventbus.Subscribe;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | /**
9 | * @Author: alex
10 | * @Description:
11 | * @Date: created in 2019/1/17.
12 | */
13 | public class StopAggregeListener implements AggregeListener {
14 | private static final Logger LOGGER = LoggerFactory.getLogger(StopAggregeListener.class);
15 |
16 | @Subscribe
17 | @Override
18 | public void lister(StopAggregeEvent event) {
19 | if (LOGGER.isDebugEnabled()) LOGGER.debug("Stop");
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/BreakDataBindAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 | import com.github.middleware.aggregate.flow.context.Invocation;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description:
9 | * @Date: created in 2019/2/14.
10 | */
11 | public class BreakDataBindAggregeEvent extends AggregeEvent {
12 | private transient Invocation invocation;
13 | public BreakDataBindAggregeEvent(Object source, Invocation invocation) {
14 | super(source);
15 | this.invocation = invocation;
16 | }
17 |
18 | public Invocation getInvocation() {
19 | return invocation;
20 | }
21 |
22 | public void setInvocation(Invocation invocation) {
23 | this.invocation = invocation;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/BreakDataBindAggregeEventListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.github.middleware.aggregate.flow.ItemCommand;
5 | import com.google.common.collect.Lists;
6 | import com.google.common.eventbus.Subscribe;
7 | import org.slf4j.Logger;
8 | import org.slf4j.LoggerFactory;
9 |
10 | import java.util.List;
11 |
12 | /**
13 | * @Author: alex
14 | * @Description:
15 | * @Date: created in 2019/2/14.
16 | */
17 | public class BreakDataBindAggregeEventListener implements AggregeListener {
18 | private static final Logger LOGGER = LoggerFactory.getLogger(BreakDataBindAggregeEventListener.class);
19 | private List breakFilterRules = Lists.newArrayList(ItemCommand.ALL);
20 |
21 | @Subscribe
22 | @Override
23 | public void lister(BreakDataBindAggregeEvent event) {
24 | if (LOGGER.isDebugEnabled()) LOGGER.debug("field={}", event.getSource());
25 | event.getInvocation().getMetaContext().setFilterRules(breakFilterRules);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/ContractInvokeAfterAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 | import com.github.middleware.aggregate.flow.context.Invocation;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description: ItemProxyFetchDataCommand.invoke之后,后一个链之前
9 | * @Date: created in 2019/1/18.
10 | */
11 | public class ContractInvokeAfterAggregeEvent extends AggregeEvent {
12 | private transient Object response;
13 | private transient Invocation invocation;
14 |
15 | public ContractInvokeAfterAggregeEvent(Object fireSource, Object response, Invocation invocation) {
16 | super(fireSource);
17 | this.response = response;
18 | this.invocation = invocation;
19 | }
20 |
21 | public Object getResponse() {
22 | return response;
23 | }
24 |
25 | public void setResponse(Object response) {
26 | this.response = response;
27 | }
28 |
29 | public Invocation getInvocation() {
30 | return invocation;
31 | }
32 |
33 | public void setInvocation(Invocation invocation) {
34 | this.invocation = invocation;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/ContractInvokeAfterAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.google.common.eventbus.Subscribe;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | /**
9 | * @Author: alex
10 | * @Description:
11 | * @Date: created in 2019/1/18.
12 | */
13 | public class ContractInvokeAfterAggregeListener implements AggregeListener {
14 | private static final Logger LOGGER = LoggerFactory.getLogger(ContractInvokeAfterAggregeListener.class);
15 |
16 | @Subscribe
17 | @Override
18 | public void lister(ContractInvokeAfterAggregeEvent event) {
19 | if (LOGGER.isDebugEnabled()) LOGGER.debug("field={},response={}",event.getSource(),event.getResponse());
20 | if (event.getResponse() == null) {
21 | //转发事件
22 | event.getInvocation().getEventBus().post(new BreakDataBindAggregeEvent(event.getSource(), event.getInvocation()));
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/ContractInvokeBeforeAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 | import com.github.middleware.aggregate.flow.context.Invocation;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description: ItemProxyFetchDataCommand.invoke之前,前一个链(ItemProxyArgBuildCommand)之后
9 | * @Date: created in 2019/1/18.
10 | */
11 | public class ContractInvokeBeforeAggregeEvent extends AggregeEvent {
12 | private transient Invocation invocation;
13 | private transient Object arg;
14 |
15 | public ContractInvokeBeforeAggregeEvent(Object source, Object arg, Invocation invocation) {
16 | super(source);
17 | this.arg = arg;
18 | this.invocation = invocation;
19 | }
20 |
21 | public Object getArg() {
22 | return arg;
23 | }
24 |
25 | public void setArg(Object arg) {
26 | this.arg = arg;
27 | }
28 |
29 | public Invocation getInvocation() {
30 | return invocation;
31 | }
32 |
33 | public void setInvocation(Invocation invocation) {
34 | this.invocation = invocation;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/ContractInvokeBeforeAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.google.common.eventbus.Subscribe;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | import java.util.List;
9 | import java.util.Objects;
10 |
11 | /**
12 | * @Author: alex
13 | * @Description:
14 | * @Date: created in 2019/1/18.
15 | */
16 | public class ContractInvokeBeforeAggregeListener implements AggregeListener {
17 | private static final Logger LOGGER = LoggerFactory.getLogger(ContractInvokeBeforeAggregeListener.class);
18 |
19 | @Subscribe
20 | @Override
21 | public void lister(ContractInvokeBeforeAggregeEvent event) {
22 | if (LOGGER.isDebugEnabled()) LOGGER.debug("field={},arg={}",event.getSource(), event.getArg());
23 | if (isNullParams(event)) {
24 | //转发事件
25 | event.getInvocation().getEventBus().post(new BreakDataBindAggregeEvent(event.getSource(), event.getInvocation()));
26 | }
27 |
28 | }
29 |
30 | private boolean isNullParams(ContractInvokeBeforeAggregeEvent event) {
31 | if (event.getArg() == null) {
32 | return true;
33 | }
34 | if (event.getArg() instanceof List) {
35 | List eventArg = (List) event.getArg();
36 | long nullCount = eventArg.stream().filter(Objects::isNull).count();
37 | if (eventArg.size() == nullCount) {
38 | return true;
39 | }
40 | }
41 | return false;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/DataBindBeforeAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: ItemBinder.invoke 执行之前,其实也是MethodProceedCallback.proceed 之后
8 | * @Date: created in 2019/1/17.
9 | */
10 | public class DataBindBeforeAggregeEvent extends AggregeEvent {
11 | private transient Object item;
12 |
13 | public DataBindBeforeAggregeEvent(Object source, Object item) {
14 | super(source);
15 | this.item = item;
16 | }
17 |
18 | public Object getItem() {
19 | return item;
20 | }
21 |
22 | public void setItem(Object item) {
23 | this.item = item;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/DataBindBeforeAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeListener;
4 | import com.google.common.eventbus.Subscribe;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | /**
9 | * @Author: alex
10 | * @Description:
11 | * @Date: created in 2019/1/17.
12 | */
13 | public class DataBindBeforeAggregeListener implements AggregeListener {
14 | private static final Logger LOGGER = LoggerFactory.getLogger(DataBindBeforeAggregeListener.class);
15 |
16 | @Subscribe
17 | @Override
18 | public void lister(DataBindBeforeAggregeEvent event) {
19 | if (LOGGER.isDebugEnabled()) LOGGER.debug("data={}", event.getItem());
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/InterceptorAfterAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: AggregeEngineActivetor.intercept 退出前
8 | * @Date: created in 2019/1/17.
9 | */
10 | public class InterceptorAfterAggregeEvent extends AggregeEvent {
11 | private transient Object result;
12 |
13 | public InterceptorAfterAggregeEvent(Object source, Object result) {
14 | super(source);
15 | this.result = result;
16 | }
17 |
18 | public Object getResult() {
19 | return result;
20 | }
21 |
22 | public void setResult(Object result) {
23 | this.result = result;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/InterceptorAfterAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeContext;
4 | import com.github.middleware.aggregate.context.AggregeListener;
5 | import com.google.common.eventbus.Subscribe;
6 | import org.slf4j.Logger;
7 | import org.slf4j.LoggerFactory;
8 |
9 | /**
10 | * @Author: alex
11 | * @Description:
12 | * @Date: created in 2019/1/17.
13 | */
14 | public class InterceptorAfterAggregeListener implements AggregeListener {
15 | private static final Logger LOGGER = LoggerFactory.getLogger(InterceptorAfterAggregeListener.class);
16 |
17 | @Subscribe
18 | @Override
19 | public void lister(InterceptorAfterAggregeEvent event) {
20 | if (LOGGER.isDebugEnabled()) LOGGER.debug("method={},data={}", event.getSource(), event.getResult());
21 | AggregeContext.removeContext();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/InterceptorBeforeAggregeEvent.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeEvent;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: AggregeEngineActivetor.intercept 进入后
8 | * @Date: created in 2019/1/17.
9 | */
10 | public class InterceptorBeforeAggregeEvent extends AggregeEvent {
11 |
12 | public InterceptorBeforeAggregeEvent(Object source) {
13 | super(source);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/context/session/InterceptorBeforeAggregeListener.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.context.session;
2 |
3 | import com.github.middleware.aggregate.context.AggregeContext;
4 | import com.github.middleware.aggregate.context.AggregeListener;
5 | import com.google.common.eventbus.Subscribe;
6 | import org.slf4j.Logger;
7 | import org.slf4j.LoggerFactory;
8 |
9 | /**
10 | * @Author: alex
11 | * @Description:
12 | * @Date: created in 2019/1/17.
13 | */
14 | public class InterceptorBeforeAggregeListener implements AggregeListener {
15 | private static final Logger LOGGER = LoggerFactory.getLogger(InterceptorBeforeAggregeListener.class);
16 |
17 | @Subscribe
18 | @Override
19 | public void lister(InterceptorBeforeAggregeEvent event) {
20 | if (LOGGER.isDebugEnabled()) LOGGER.debug("method={}" ,event.getSource());
21 | AggregeContext.getContext().setFireSource(event.getSource().toString());
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/contract/ResponseResolver.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.contract;
2 |
3 | /**
4 | * 包含自定义convert,过滤
5 | */
6 | /**
7 | * @Author: alex
8 | * @Description:
9 | * @Date: created in 2019/1/10.
10 | */
11 | public interface ResponseResolver {
12 | Object resolve(Object response);
13 | }
14 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/contract/ServiceConsumerEndpoint.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.contract;
2 |
3 |
4 | /**
5 | * @Author: alex
6 | * @Description: esb、eureka、tcp、普通的bean
7 | * @Date: created in 2019/1/9.
8 | */
9 | public interface ServiceConsumerEndpoint {
10 | Object getServiceBean(String beanName, Object applicationContext);
11 | }
12 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/contract/support/NothingResponseResolver.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.contract.support;
2 |
3 | import com.github.middleware.aggregate.contract.ResponseResolver;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/1/10.
9 | */
10 | public class NothingResponseResolver implements ResponseResolver {
11 | @Override
12 | public Object resolve(Object response) {
13 | return response;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/contract/support/Proxys.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.contract.support;
2 |
3 | import com.github.middleware.aggregate.contract.ServiceConsumerEndpoint;
4 | import com.github.middleware.aggregate.core.AggregeException;
5 | import com.github.middleware.aggregate.core.support.ExtensionLoaders;
6 | import com.google.common.base.Preconditions;
7 | import com.google.common.base.Strings;
8 | import com.google.common.collect.Maps;
9 | import org.springframework.util.ClassUtils;
10 |
11 | import java.util.Map;
12 |
13 | /**
14 | * @Author: alex
15 | * @Description:
16 | * @Date: created in 2019/1/9.
17 | */
18 | public final class Proxys {
19 | private static final Map serviceEndpoint = Maps.newConcurrentMap();
20 |
21 | private static Object monitor = new Object();
22 |
23 | private Proxys() {
24 | }
25 |
26 | public static Object getBean(String proxyName, Object springIOC) {
27 | Preconditions.checkArgument(!Strings.isNullOrEmpty(proxyName), "获取Client Proxy失败,参数AggregeProxy[name]为必填项。");
28 | if (serviceEndpoint.containsKey(proxyName)) {
29 | return serviceEndpoint.get(proxyName);
30 | }
31 | if (proxyName.startsWith("#")) {
32 | loadBean(proxyName, springIOC);
33 | } else {
34 | newBean(proxyName);
35 | }
36 | return serviceEndpoint.get(proxyName);
37 | }
38 |
39 | private static void newBean(String cls) {
40 | Object proxy = ServiceEndpointCreators.instance(cls);
41 | synchronized (monitor) {
42 | serviceEndpoint.put(cls, proxy);
43 | }
44 | }
45 |
46 | private static void loadBean(String beanName, Object applicationContext) {
47 | synchronized (monitor) {
48 | ExtensionLoaders.getExtensionLoader(ServiceConsumerEndpoint.class).flatMap(x -> x.getExtension()).ifPresent(x -> {
49 | String name = beanName.substring(1);
50 | Object serviceBean = x.getServiceBean(name, applicationContext);
51 | serviceEndpoint.put(beanName, serviceBean);
52 | });
53 | }
54 | }
55 |
56 | public static class ServiceEndpointCreators {
57 | private ServiceEndpointCreators() {
58 | }
59 |
60 | public static Object instance(String cls) {
61 | try {
62 | return ClassUtils.forName(cls, Thread.currentThread().getContextClassLoader()).newInstance();
63 | } catch (Exception e) {
64 | throw new AggregeException("实例化AggregeProxy.name[" + cls + "]失败,", e);
65 | }
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/AggregeEngine.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 | import com.github.middleware.aggregate.config.MergeProperties;
4 | import com.google.common.eventbus.EventBus;
5 | import com.github.middleware.aggregate.annonation.AggregeEnable;
6 |
7 | /**
8 | * @Author: alex
9 | * @Description: 功能描述:完成对数据项(Item)的聚合及绑定
10 | * @Date: created in 2019/1/15.
11 | */
12 | public interface AggregeEngine {
13 | void loadConfig(MergeProperties config);
14 |
15 | void start();
16 |
17 | boolean isRunning();
18 |
19 | void stop();
20 |
21 | Object dataBind(RequestPayLoad requestPayLoad);
22 |
23 | EventBus getEventBus();
24 | }
25 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/AggregeEngineActivetor.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 |
4 | /**
5 | * @Author: alex
6 | * @Description:
7 | * @Date: created in 2019/1/15.
8 | */
9 | public interface AggregeEngineActivetor {
10 | Object intercept(RequestPayLoad request);
11 |
12 | AggregeEngine getAggregeEngine();
13 | }
14 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/AggregeException.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 | /**
4 | * @Author: alex
5 | * @Description:
6 | * @Date: created in 2019/2/15.
7 | */
8 | public class AggregeException extends RuntimeException {
9 | private String requestId;
10 | private String errorCode;
11 | private String errorMessage;
12 |
13 | public AggregeException(String errorMessage) {
14 | this(errorMessage, null);
15 | }
16 |
17 | public AggregeException(Throwable cause) {
18 | this(null, cause);
19 | }
20 |
21 | public AggregeException(String errorMessage, Throwable cause) {
22 | super(null, cause);
23 | this.errorMessage = errorMessage;
24 | }
25 |
26 | public AggregeException(String errorMessage, String errorCode, String requestId, Throwable cause) {
27 | this(errorMessage, cause);
28 | this.errorCode = errorCode;
29 | this.requestId = requestId;
30 | }
31 |
32 | public AggregeException(String errorMessage, String errorCode, String requestId) {
33 | this(errorMessage, errorCode, requestId, null);
34 | }
35 |
36 | @Override
37 | public String getMessage() {
38 | return super.getMessage()
39 | + (requestId == null ? "" : "\n[requestId]: " + requestId)
40 | + (errorCode == null ? "" : "\n[errorCode]: " + errorCode);
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/ExtensionLoader.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 | import java.util.List;
4 | import java.util.Optional;
5 |
6 | /**
7 | * @Author: alex
8 | * @Description:
9 | * @Date: created in 2019/1/9.
10 | */
11 | public interface ExtensionLoader {
12 | List getExtensions();
13 |
14 | Optional getExtension();
15 |
16 | Optional getExtension(String regex);
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/LasyLoadData.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 | import java.util.function.Supplier;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description: 封装被拦截的业务方法,提供触发点
8 | * @Date: created in 2019/1/11.
9 | */
10 | @FunctionalInterface
11 | public interface LasyLoadData extends Supplier {
12 | }
13 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/RequestPayLoad.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core;
2 |
3 | import com.github.middleware.aggregate.annonation.AggregeEnable;
4 |
5 | import java.io.Serializable;
6 | import java.lang.reflect.Method;
7 |
8 | /**
9 | * @Author: alex.chen
10 | * @Description:
11 | * @Date: 2019/10/30
12 | */
13 | public class RequestPayLoad implements Serializable {
14 | private String eventSource;
15 | private Object springIOC;
16 | private T data;
17 | private LasyLoadData lasyLoadData;
18 | private Boolean parallel;
19 | private AggregeEnable enable;
20 |
21 | public RequestPayLoad(String eventSource, Object springIOC, T data, Boolean parallel) {
22 | this.eventSource = eventSource;
23 | this.springIOC = springIOC;
24 | this.data = data;
25 | this.parallel = parallel;
26 | }
27 |
28 | public RequestPayLoad(Method intercept, Object springIOC, LasyLoadData lasyLoadData, AggregeEnable enable) {
29 | if (intercept != null) {
30 | eventSource = String.format("%s.%s", intercept.getDeclaringClass().getName(), intercept.getName());
31 | }
32 | this.springIOC = springIOC;
33 | this.lasyLoadData = lasyLoadData;
34 | if (enable != null) {
35 | parallel = enable.parallel();
36 | }
37 | }
38 |
39 | public String getEventSource() {
40 | return eventSource;
41 | }
42 |
43 | public void setEventSource(String eventSource) {
44 | this.eventSource = eventSource;
45 | }
46 |
47 | public Object getSpringIOC() {
48 | return springIOC;
49 | }
50 |
51 | public void setSpringIOC(Object springIOC) {
52 | this.springIOC = springIOC;
53 | }
54 |
55 | public T getData() {
56 | return data;
57 | }
58 |
59 | public void setData(T data) {
60 | this.data = data;
61 | }
62 |
63 | public LasyLoadData getLasyLoadData() {
64 | return lasyLoadData;
65 | }
66 |
67 | public void setLasyLoadData(LasyLoadData lasyLoadData) {
68 | this.lasyLoadData = lasyLoadData;
69 | }
70 |
71 | public Boolean getParallel() {
72 | return parallel;
73 | }
74 |
75 | public void setParallel(Boolean parallel) {
76 | this.parallel = parallel;
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/support/AbstractAggregeEngineActivetor.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core.support;
2 |
3 | import com.github.middleware.aggregate.annonation.AggregeEnable;
4 | import com.github.middleware.aggregate.context.session.DataBindBeforeAggregeEvent;
5 | import com.github.middleware.aggregate.context.session.InterceptorAfterAggregeEvent;
6 | import com.github.middleware.aggregate.context.session.InterceptorBeforeAggregeEvent;
7 | import com.github.middleware.aggregate.core.*;
8 | import com.google.common.base.Preconditions;
9 | import org.slf4j.Logger;
10 | import org.slf4j.LoggerFactory;
11 |
12 | /**
13 | * @Author: alex.chen
14 | * @Description:
15 | * @Date: 2019/10/30
16 | */
17 | public abstract class AbstractAggregeEngineActivetor implements AggregeEngineActivetor {
18 | private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAggregeEngineActivetor.class);
19 | protected AggregeEngine aggregeEngine;
20 |
21 | public AbstractAggregeEngineActivetor() {
22 | ExtensionLoaders.getExtensionLoader(AggregeEngine.class).flatMap(ExtensionLoader::getExtension).ifPresent(x -> aggregeEngine = x);
23 | }
24 |
25 | @Override
26 | public Object intercept(RequestPayLoad request) {
27 | Preconditions.checkNotNull(request.getEventSource(), "target method is required.");
28 | Preconditions.checkNotNull(aggregeEngine, "aggregeEngine is required.");
29 | Preconditions.checkState(aggregeEngine.isRunning(), "aggregeEngine must be start.");
30 | try {
31 | aggregeEngine.getEventBus().post(new InterceptorBeforeAggregeEvent(request.getEventSource()));
32 | Object item = request.getData();
33 | if (request.getLasyLoadData() != null) {
34 | item = request.getLasyLoadData().get();
35 | }
36 | if (item == null) {
37 | LOGGER.warn("{}的返回值为null.", request.getEventSource());
38 | return null;
39 | }
40 | request.setData(item);
41 | aggregeEngine.getEventBus().post(new DataBindBeforeAggregeEvent(request.getEventSource(), item));
42 | Object result = doDataBind(request);
43 | aggregeEngine.getEventBus().post(new InterceptorAfterAggregeEvent(request.getEventSource(), result));
44 | return result;
45 | } catch (AggregeException ex1) {
46 | aggregeEngine.getEventBus().post(new InterceptorAfterAggregeEvent(request.getEventSource(), null));
47 | throw ex1;
48 | } catch (Exception ex) {
49 | aggregeEngine.getEventBus().post(new InterceptorAfterAggregeEvent(request.getEventSource(), null));
50 | throw new AggregeException(ex);
51 | }
52 | }
53 |
54 | @Override
55 | public AggregeEngine getAggregeEngine() {
56 | return aggregeEngine;
57 | }
58 |
59 | protected abstract Object doDataBind(RequestPayLoad request);
60 | }
61 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/support/AggregeEngineActivetorFactory.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core.support;
2 |
3 | import com.github.middleware.aggregate.core.AggregeEngineActivetor;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/1/15.
9 | */
10 | public class AggregeEngineActivetorFactory {
11 | private static final AggregeEngineActivetorFactory FACTORY = new AggregeEngineActivetorFactory();
12 |
13 | private AggregeEngineActivetorFactory() {
14 | }
15 |
16 | public static AggregeEngineActivetorFactory getInstance() {
17 | return FACTORY;
18 | }
19 |
20 | public AggregeEngineActivetor create(Boolean sateful) {
21 | if (sateful == null) {
22 | return getResource();
23 | }
24 | return new GenClzProxyAggregeEngineActivetor();
25 | }
26 |
27 | public AggregeEngineActivetor getResource() {
28 | return ResourceHolder.AOP_ENGINE;
29 | }
30 |
31 | private static class ResourceHolder {
32 | // This will be lazily initialised
33 | public static AggregeEngineActivetor AOP_ENGINE = new DefaultAggregeEngineActivetor();
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/support/AggregeEngineActivetors.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core.support;
2 |
3 | import com.github.middleware.aggregate.core.AggregeEngineActivetor;
4 |
5 | /**
6 | * @Author: alex
7 | * @Description:
8 | * @Date: created in 2019/1/15.
9 | */
10 | public class AggregeEngineActivetors {
11 | private AggregeEngineActivetors() {
12 |
13 | }
14 |
15 | public static AggregeEngineActivetor getEngineAcitvetor() {
16 | return AggregeEngineActivetorFactory.getInstance().create(null);
17 | }
18 |
19 | public static AggregeEngineActivetor getEngineAcitvetorStateful() {
20 | return AggregeEngineActivetorFactory.getInstance().create(true);
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/data-aggregate-core/src/main/java/com/github/middleware/aggregate/core/support/DefaultAggregeEngine.java:
--------------------------------------------------------------------------------
1 | package com.github.middleware.aggregate.core.support;
2 |
3 | import com.github.middleware.aggregate.config.MergeProperties;
4 | import com.github.middleware.aggregate.context.AggregeContext;
5 | import com.github.middleware.aggregate.context.AggregeListener;
6 | import com.github.middleware.aggregate.core.AggregeEngine;
7 | import com.github.middleware.aggregate.core.AggregeException;
8 | import com.github.middleware.aggregate.core.ExtensionLoader;
9 | import com.github.middleware.aggregate.core.RequestPayLoad;
10 | import com.github.middleware.aggregate.flow.ItemBinder;
11 | import com.github.middleware.aggregate.flow.ItemCommand;
12 | import com.github.middleware.aggregate.flow.builder.Steps;
13 | import com.github.middleware.aggregate.flow.context.Invocation;
14 | import com.github.middleware.aggregate.source.MetaHolderFactory;
15 | import com.github.middleware.aggregate.source.bean.MetaHolder;
16 | import com.google.common.base.Preconditions;
17 | import com.google.common.collect.Lists;
18 | import com.google.common.eventbus.EventBus;
19 | import com.github.middleware.aggregate.context.container.StartedAggregeEvent;
20 | import com.github.middleware.aggregate.context.container.StopAggregeEvent;
21 | import com.github.middleware.aggregate.annonation.AggregeEnable;
22 | import io.reactivex.Flowable;
23 | import io.reactivex.schedulers.Schedulers;
24 | import org.yaml.snakeyaml.Yaml;
25 |
26 | import java.util.List;
27 | import java.util.concurrent.*;
28 | import java.util.concurrent.atomic.AtomicBoolean;
29 | import java.util.concurrent.atomic.AtomicInteger;
30 |
31 | /**
32 | * @Author: alex
33 | * @Description:
34 | * @Date: created in 2019/1/15.
35 | */
36 | public final class DefaultAggregeEngine implements AggregeEngine {
37 | private AtomicBoolean start = new AtomicBoolean(false);
38 | private static final String PROPERTY_FILE_NAME = "data-aggrege.yml";
39 | private List notBatchFilterRules = Lists.newArrayList(ItemCommand.BATCHPROXYARGBUILD, ItemCommand.BATCHPROXYFETCHDATA);
40 | private MergeProperties properties;
41 | private ThreadPoolExecutor threadPoolExecutor = null;
42 | private MetaHolderFactory metaHolderFactory;
43 | private ItemBinder itemBinder;
44 | private EventBus eventBus;
45 |
46 | @Override
47 | public void start() {
48 | if (start.compareAndSet(false, true)) {
49 | initComponent();
50 | eventBus.post(new StartedAggregeEvent("start"));
51 | }
52 | }
53 |
54 | /**
55 | * 支持spring或非spring环境下配置
56 | *
57 | * @param config
58 | */
59 | @Override
60 | public void loadConfig(MergeProperties config) {
61 | if (config != null) {
62 | properties = config;
63 | }
64 | if (properties == null) {
65 | //读配置
66 | properties = readProperty(MergeProperties.class, PROPERTY_FILE_NAME);
67 | }
68 | }
69 |
70 | private void initComponent() {
71 | loadConfig(null);
72 | threadPoolExecutor = new ThreadPoolExecutor(properties.getCorePoolSize(), properties.getCorePoolSize(), properties.getKeepAliveTime(),
73 | TimeUnit.SECONDS, new LinkedBlockingQueue(properties.getWorkQueueSize()), new NamedThreadFactory("aggrege"), new ThreadPoolExecutor.AbortPolicy());
74 | //实例化元数据读取组件
75 | ExtensionLoaders.getExtensionLoader(MetaHolderFactory.class).flatMap(ExtensionLoader::getExtension).ifPresent(x -> {
76 | metaHolderFactory = x;
77 | metaHolderFactory.lasyInit(properties);
78 | });
79 | //实例化数据聚合处理组件
80 | itemBinder = Steps.getBuilder().start().config(properties).loadAndSort().buildInvokerChain();
81 | //事件风暴组件
82 | eventBus = new EventBus();
83 | ExtensionLoaders.getExtensionLoader(AggregeListener.class).ifPresent(x -> {
84 | x.getExtensions().forEach(v -> eventBus.register(v));
85 | });
86 | }
87 |
88 | @Override
89 | public boolean isRunning() {
90 | return start.get();
91 | }
92 |
93 | @Override
94 | public void stop() {
95 | if (start.compareAndSet(true, false)) {
96 | eventBus.post(new StopAggregeEvent("stop"));
97 | threadPoolExecutor.shutdown();
98 | }
99 | }
100 |
101 | @Override
102 | public Object dataBind(RequestPayLoad request) {
103 | Preconditions.checkArgument(start.get(), "AggregeEngine未启动,请确认用法是否正确!");
104 | if (request.getData() == null) {
105 | return null;
106 | }
107 | Invocation invocation = new Invocation(request.getParallel(), eventBus, AggregeContext.getContext());
108 | invocation.setSpringIOC(request.getSpringIOC());
109 | if (request.getData() instanceof List) {
110 | List