专栏名称: 狗厂
目录
相关文章推荐
湖北省教育厅  ·  看!我省中小学精彩大课间(五) ·  2 天前  
北京这点事  ·  北京:推进汽车以旧换新政策初见成效 ·  2 天前  
北京这点事  ·  北京:推进汽车以旧换新政策初见成效 ·  2 天前  
湖北省教育厅  ·  教育部公布这一活动结果!湖北多所高校入选 ·  3 天前  
湖北省教育厅  ·  教育部公布这一活动结果!湖北多所高校入选 ·  3 天前  
北京吃货小分队  ·  接下来的一周,北京有好玩的了 | 北京LOOK ·  3 天前  
最爱大北京  ·  周杰伦方紧急声明! ·  3 天前  
51好读  ›  专栏  ›  狗厂

利用Spring管理热加载的Groovy对象

狗厂  · 掘金  ·  · 2018-07-19 07:04

正文

原因

最近做的项目属于数据分析类型,要求数据分析功能做到快速上线。该项目当前使用的语言是Java + Groovy。 使用Groovy的原因很简单,因为 Groovy 脚本支持热加载功能。项目中,简单的数据分析工作,如一些统计、排序、过滤等,都放在Groovy里完成。需要上线新的数据分析功能时,只需要编写一个新的脚本,并热加载到JVM中即可。

现在希望将一些数据源访问、数据预处理的工作也放到 Groovy 脚本中完成,并具有这样的功能:项目在线上稳定运行期间,可以通过修改数据库中的脚本来完成新产品的上线。

解决方案

  • PlanA: Java + 热加载
  • PlanB: Groovy + 热加载

最终选择的方案是PlanB:让 Groovy 脚本需要具有访问数据源、调用rpc服务等等的能力。核心思路是利用Spring对Groovy脚本进行管理。

  1. Groovy 脚本保存在数据库中。定时任务不断轮训数据库检测Groovy脚本的更新时间,若有更新,则读取脚本内容,并解析为Class。
  2. 然后利用Spring提供的工具类BeanDefinitionBuilder,生成BeanDefinition。BeanDefinition中保存了Groovy脚本的meta信息,比如对其他类的依赖。
  3. 接着,将BeanDefinition放入Spring上下文ApplicationContext中,并调用初始化方法,对bean进行依赖注入。
  4. 最后,调用context.getBean(“xxx”)拿到该脚本。

当然,需要注意的细节有很多,比如服务降级、安全控制等,这里就不展开说了。

架构简图

简单实现

Hello.groovy 这是保存在数据库中的Groovy脚本。

import org.springframework.beans.factory.annotation.Autowired

class Hello {
    @Autowired
    HelloService service;

    HelloService getService() {
        return service
    }

    def run() {
        print(service.hello())
    }
}

HelloService.java 这是项目中已经提供的服务,现实项目中可以是访问数据源等功能。







请到「今天看啥」查看全文


推荐文章
湖北省教育厅  ·  看!我省中小学精彩大课间(五)
2 天前
北京这点事  ·  北京:推进汽车以旧换新政策初见成效
2 天前
北京这点事  ·  北京:推进汽车以旧换新政策初见成效
2 天前
北京吃货小分队  ·  接下来的一周,北京有好玩的了 | 北京LOOK
3 天前
最爱大北京  ·  周杰伦方紧急声明!
3 天前
广东台今日关注  ·  便民也扰民 共享单车开始受质疑
8 年前
中国经济网  ·  为人(写的真好)丨可读
8 年前
最搞笑笑话王  ·  昨晚发生的一幕,全国沸腾!
8 年前