Spring 无关联并发聚合器 concurrent-aggregator

未知
Java
跨平台
2019-07-11
赵伟伟

背景与目的

在开发后台接口时, 为了开发效率, 我们往往习惯编写串行执行的代码, 去调用不同的接口,

即使这些接口之间并无依赖, 这使得最后开发的接口性能低下, 且数据不方便复用

此框架目的旨在保持开发效率的同时, 很方便地支持并发和数据复用

原理

  1. Spring + CountDownLatch + Future + 反射 + 动态代理
  2. 通过启动类的注解去加载需要代理的接口,
  3. 用 Factorybean 将代理的bean注册到spring 容器
  4. 代理接口使用注解配置使用 spring 的 bean 来完成操作
  5. 线程池执行具体的操作,CountDownLatch做同步
  6. 目前自动识别代理方法的类型和参数比较弱鸡,后续需要继续完善
  7. 工程需要自己下载下来 install

注解介绍

  • @EnableConcurrentAggregate 定义数据提供者
  • @ConcurrentAggregate 动态代理的接口上需要添加注解
  • @AggregateProviders 并行处理的提供者注解
  • @AggregateProvider  定单个并行处理的方法的注解
  • @AggregateConsumer   最后聚合的方注解
  • @AggregateParameterName 参数名

使用方法

pom.xml

<dependency>
    <groupId>com.wolfking</groupId>
    <artifactId>concurrent-aggregator</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

启动类添加注解

    @EnableConcurrentAggregate("com.xxx.service.xxx.aggregator")

示例

开发h5首页接口,需要从七八个地方组织数据,并且数据没有关联,7个接口串联调用需要3秒

IndexService.java
IndexService.java
    1. IndexVo assemblyExperience(IndexVo indexVo, Integer tenantId)
    2. IndexVo assemblyTheme(IndexVo indexVo, Integer tenantId)
    3. IndexVo assemblyFounder(IndexVo indexVo, Integer tenantId, Integer customerId)
    4. IndexVo assemblyRaffleActivity(IndexVo indexVo, Integer tenantId)
    5. IndexVo assemblyAgreeActivity(IndexVo indexVo, Integer tenantId, Integer customerId, Integer userId)
    6. IndexVo assemblyBargin(IndexVo indexVo, Integer tenantId, Integer customerId)
    7. IndexVo assemblyGroup(IndexVo indexVo, Integer tenantId, Integer customerId)
    8. IndexVo assemblyGroup(IndexVo indexVo, Integer tenantId, Integer customerId)
    9. IndexVo assemblyReduction(IndexVo indexVo, Integer tenantId, Integer customerId)
    10.void summary()    ---汇聚接口

定义并发代理的接口

最后汇聚AggregateConsumer输入参数是AggregateProvider每个的返回值,discardResult除外,汇聚的可以没有

@ConcurrentAggregate
public interface IndexAggregatorProxy {

    @AggregateProviders(ignoreException = true, timeout = 5000, value = {
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyExperience",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyTheme",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyFounder",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId"), @AggregateParameter("customerId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyRaffleActivity",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyAgreeActivity",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId"), @AggregateParameter("customerId"), @AggregateParameter("userId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyBargin",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId"), @AggregateParameter("customerId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyGroup",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId"), @AggregateParameter("customerId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyInviteFriend",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId")}),
            @AggregateProvider(beanClass = IndexService.class, method = "assemblyReduction",
                    parameters = {@AggregateParameter("index"), @AggregateParameter("tenantId"), @AggregateParameter("customerId")})})
    @AggregateConsumer(beanClass = IndexService.class,method = "summary")
    void index(@AggregateParameterName("index") IndexVo indexVo,
               @AggregateParameterName("tenantId") Integer tenantId,
               @AggregateParameterName("customerId") Integer customerId,
               @AggregateParameterName("userId") Integer userId);
}

在spring的service中使用并发代理的接口,直接注入就行

    @Autowired
    @SuppressWarnings("all")
    private IndexAggregatorProxy indexAggregatorProxy;

 

的码云指数为
超过 的项目
加载中

评论(2)

阿毛的故事
这个和CompletableFuture比哪个好
赵伟伟
赵伟伟 软件作者
怎么说呢,并发代码和业务代码耦合在一起,比较难维护

暂无资讯

暂无问答

Hadoop Streaming 实战: aggregate

1. aggregate概述 aggregate是Hadoop提供的一个软件包,其用来做一些通用的计算和聚合。 Generally speaking, in order to implement an application using Map/Reduce model, the developer...

2015/12/23 13:25
6
0
一个关于heka采集系统的问题

在配置heka过程中,发现一直无法得到想要的结果,通过查看内部源码发现protobuf.go内部的Decode接口实现稍微有点问题,做下记录

2014/12/24 15:54
916
0
第八章 聚合与继承

聚合与继承

2015/09/23 01:09
87
0
Metasploit中aggregator插件无法使用

Metasploit中aggregator插件无法使用 aggregator是Metasploit自带的一个插件,用来管理会话Session。该插件使用metasploit-aggreator库。由于该库不支持Metasploit现在所使用的Ruby 2.5版本,...

04/19 10:20
2
0
OpenTSDB的读写API

OpenTSDB提供三种方式的读写操作:telnet、http、post,但官方并没提供JAVA版的API。 多亏有开源贡献者“shifeng258”,他用java编写了 [opentsdb-client](https://github.com/shifeng258/op...

2016/06/26 23:05
2K
3
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public void ...

2018/11/12 23:13
38
0
carbon进程

本文档对carbon里面几个进程的功能进行简要描述

2016/07/05 09:54
176
1
maven聚合和继承

Maven聚合与继承 一、聚合 为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggregator的模块,然后通过该模块构建整个项目的所...

2016/02/29 09:35
79
1

没有更多内容

加载失败,请刷新页面

返回顶部
顶部