concurrent-aggregator 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
concurrent-aggregator 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议: 未知
开发语言: 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;

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

concurrent-aggregator 的相关资讯

还没有任何资讯

concurrent-aggregator 的相关博客

concurrent

从性能的角度看,如果没有任务会阻塞,那么在单处理器机器上使用并发就没有任何意义。 线程机制分为:协作式和抢占式。Java的...

java concurrent

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功...

Prism_Event Aggregator(4)

Event Aggregator Prism库提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。该机制基于事件聚合器服务,允许...

concurrent包

atomic : jdk1.5 提供了方便在多线程环境下 进行无锁的原子操作 , 底层使用了处理器的提供的原子指令 ,不同cpu架构提供的原...

ConCurrent与copyOnWrite

ConCurrentHashMap最高支持16个段,如果多个线程访问不同的段,则支持高并发,最罪根本的原理,设计思想就是细粒度,分段seg...

Metasploit中aggregator插件无法使用

Metasploit中aggregator插件无法使用 aggregator是Metasploit自带的一个插件,用来管理会话Session。该插件使用metasploit-ag...

从atomicInteger看concurrent

 private AtomicInteger seed; public int nextInt(int n) { while (true) { int s = seed.get(); ...

并发concurrent---2

背景:并发知识是一个程序员段位升级的体现,同样也是进入BAT的必经之路,有必要把并发知识重新梳理一遍。 并发concurrent: 使...

concurrent并发包

synchronized有增强版。那!就!是! concurrent并发包。 首先说一下重入锁。 import java.util.concurrent.locks.ReentrantL...

concurrent-aggregator 的相关问答

还没有任何问答,马上提问

评论 (2)

加载中
这个和CompletableFuture比哪个好
2019/07/12 13:48
回复
举报
赵伟伟软件作者
怎么说呢,并发代码和业务代码耦合在一起,比较难维护
2019/07/13 21:09
回复
举报
更多评论
2 评论
11 收藏
分享
返回顶部
顶部