concurrent-aggregator

Spring 无关联并发聚合器
授权协议 未知
开发语言 Java
所属分类 程序开发、 并发/并行处理框架
软件类型 开源软件
地区 国产
投 递 者 邹铭
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

背景与目的

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

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

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

原理

  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;

 

 相关资料
  • 我开始研究 OOAD,我很难找到一个 代码示例来说明如何以编程方式实现、和。(到处都有几篇文章,但它们与 C# 或 Java 有关)。我确实找到了一两个例子,但它们都与我的导师的指示相冲突,我很困惑。 我的理解是,在: < li >关联:Foo有一个指向Bar对象的指针作为数据成员 < li >聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。 < li >组成:Foo有一

  • 在Clojure编程中,大多数数据类型都是不可变的,因此当涉及并发编程时,使用这些数据类型的代码在代码在多个处理器上运行时非常安全。 但很多时候,需要共享数据,当涉及跨多个处理器的共享数据时,有必要确保在使用多个处理器时保持数据的完整性状态。 这称为concurrent programming ,Clojure为此类编程提供支持。 通过dosync,ref,set,alter等公开的软件事务存储器

  • 我理解聚合和组合之间的区别,但我在联想方面有点挣扎。我目前的理解是,当“它们相互使用”时,类之间存在关联,例如,在方法调用期间将一个对象传递给另一个对象。另请参阅: http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit 这两个对象都是独立存在的,和聚合不同,任何对象

  • 问题内容: 我试图理解这些术语的含义。我举了一些例子,例如: 汇总:Facebook 有一个 用户 组成:facebook 中的 每个用户 都有一个 会话。 协会:人们 使用 浏览器 但是我对 具有 和 使用我的 示例感到困惑。为什么不能是用户 使用 Facebook帐户或Facebook 使用 会话来认证用户? 就OOP而言,这是错误的吗?我在哪里想念这个概念? 问题答案: 该 使用 关系意味着

  • 因此,我对UML图中的关联、聚合和组合有一些疑问。以下是一些场景: > 产品评审对产品评审的评级组成。这意味着对于每一个产品评审等级必须有产品评审?如果产品评审不存在,评审评级就没有意义。 客户NRIC协助推车和订货。我们不能使用聚合,因为如果客户不存在,购物车和订单也不存在。 有人能帮我检查一下我的关系是否正确吗?因为我对聚合和关联有点困惑,所以用关联来链接所有的表是好的吗。我不知道什么时候该用

  • 我试图确认我对关联、聚合的代码外观的理解 聚合:哈斯-a。它具有另一种类型的现有对象 组成:由另一个对象组成 协会:我对此有两种看法。 > 当一个类与另一个类相关联时。因此,上述两个都是关联的示例。 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。 我的理解正确吗?我在这里和这里阅读了相互矛盾的文章,所以我真的不确定该遵循哪一个。我的理解似乎符合第一个环节。我觉得第二个环节是错误的,或

  • 1. 集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对。 Collection中最常用的又分为两种类型的接口:List和Set,两者最明显的差别为List支持放入重复的元素,而Set不支持。 List最常用的实现类有:ArrayList、LinkedList、Vector及Stack;Set接

  • 本文向大家介绍Java中关联与聚合之间的区别,包括了Java中关联与聚合之间的区别的使用技巧和注意事项,需要的朋友参考一下 协会 就对象而言,关联是指两个相关对象之间的“具有”关系。例如,一个雇员有一个通讯地址。 聚合 就对象而言,聚合是指两个相关对象之间具有“ +”关系。例如,一个部门有多名员工。它指的是在父类中具有子对象的集合。例如: 序号 键 协会 聚合 1 定义 关联是指彼此使用的两个类之