在上一篇中讲了Flume NG配置模块主要的接口的类,PropertiesConfigurationProvider提供了基于properties配置文件的静态配置的能力,这篇细说一下PollingPropertiesFileConfigurationProvider提供的执行时动态改动配置并生效的能力。

要实现动态改动配置文件并生效,主要有两个待实现的功能

1. 观察配置文件是否改动

2. 假设改动,将改动的内容通知给观察者

对于第一点,监控配置文件是否改动,Flume NG定义了一个FileWatcherRunnable对象来监控配置文件,启动了一个单独的线程採用定时轮询的方式来监控,轮询频率是30毫秒一次。比較file.lastModified属性与lastChange时间戳,当file.lastModified > lastChange时表示文件被改动

  1. public class FileWatcherRunnable implements Runnable {
  2.  
  3. private final File file;
  4. private final CounterGroup counterGroup;
  5.  
  6. private long lastChange;
  7.  
  8. public FileWatcherRunnable(File file, CounterGroup counterGroup) {
  9. super();
  10. this.file = file;
  11. this.counterGroup = counterGroup;
  12. this.lastChange = 0L;
  13. }
  14.  
  15. @Override
  16. public void run() {
  17. LOGGER.debug("Checking file:{} for changes", file);
  18.  
  19. counterGroup.incrementAndGet("file.checks");
  20.  
  21. long lastModified = file.lastModified();
  22.  
  23. if (lastModified > lastChange) {
  24. LOGGER.info("Reloading configuration file:{}", file);
  25.  
  26. counterGroup.incrementAndGet("file.loads");
  27.  
  28. lastChange = lastModified;
  29.  
  30. try {
  31. eventBus.post(getConfiguration());
  32. } catch (Exception e) {
  33. LOGGER.error("Failed to load configuration data. Exception follows.",
  34. e);
  35. } catch (NoClassDefFoundError e) {
  36. LOGGER.error("Failed to start agent because dependencies were not " +
  37. "found in classpath. Error follows.", e);
  38. } catch (Throwable t) {
  39. // caught because the caller does not handle or log Throwables
  40. LOGGER.error("Unhandled error", t);
  41. }
  42. }
  43. }
  44. }
  45.  
  46. // PollingPropertiesFileConfigurationProvider.start()启动一个单独的线程来监控properties配置文件
  47.  public void start() {
  48.     LOGGER.info("Configuration provider starting");
  49.  
  50.     Preconditions.checkState(file != null,
  51.         "The parameter file must not be null");
  52.  
  53.     executorService = Executors.newSingleThreadScheduledExecutor(
  54.             new ThreadFactoryBuilder().setNameFormat("conf-file-poller-%d")
  55.                 .build());
  56.  
  57.     FileWatcherRunnable fileWatcherRunnable =
  58.         new FileWatcherRunnable(file, counterGroup);
  59.  
  60.     executorService.scheduleWithFixedDelay(fileWatcherRunnable, 0, interval,
  61.         TimeUnit.SECONDS);
  62.  
  63.     lifecycleState = LifecycleState.START;
  64.  
  65.     LOGGER.debug("Configuration provider started");
  66.   }

对于第二点,利用Guava EventBus提供的公布订阅模式机制,将配置改动封装成事件传递给Application。来又一次载入配置

  1. // FileWatcherRunnable.run方法 公布配置改动的事件
  2. eventBus.post(getConfiguration());
  3.  
  4. // Application.main方法来注冊事件订阅
  5. Application application;
  6.       if(reload) {
  7.         EventBus eventBus = new EventBus(agentName + "-event-bus");
  8.         PollingPropertiesFileConfigurationProvider configurationProvider =
  9.             new PollingPropertiesFileConfigurationProvider(agentName,
  10.                 configurationFile, eventBus, 30);
  11.         components.add(configurationProvider);
  12.         application = new Application(components);
  13.         eventBus.register(application);
  14.       }
  15.  
  16. // Application类採用@Subscribe标注来定义订阅方法,即配置改动后会运行handleConfigurationEvent方法,这种方法是线程安全的
  17.  
  18. @Subscribe
  19.   public synchronized void handleConfigurationEvent(MaterializedConfiguration conf) {
  20.     stopAllComponents();
  21.     startAllComponents(conf);
  22.   }

Flume NG源代码分析(二)支持执行时动态改动配置的配置模块的更多相关文章

  1. 【原创】Kakfa utils源代码分析(二)

    我们继续研究kafka.utils包 八.KafkaScheduler.scala 首先该文件定义了一个trait:Scheduler——它就是运行任务的一个调度器.任务调度的方式支持重复执行的后台任 ...

  2. CSAPP Tiny web server源代码分析及搭建执行

    1. Web基础 webclient和server之间的交互使用的是一个基于文本的应用级协议HTTP(超文本传输协议). 一个webclient(即浏览器)打开一个到server的因特网连接,而且请求 ...

  3. Appium Android Bootstrap源代码分析之启动执行

    通过前面的两篇文章<Appium Android Bootstrap源代码分析之控件AndroidElement>和<Appium Android Bootstrap源代码分析之命令 ...

  4. Android 中View的绘制机制源代码分析 二

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...

  5. 混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。

    看到一个kinect大牛编写的一个水果忍者的体感游戏版本号,让我为自己一直以来仅仅用现有的网页游戏来模拟kinect体感游戏控制感到羞愧,没办法.我还是菜鸟.学习一段后自己模仿星际大战这个游戏.自己写 ...

  6. 【原创】Kakfa log包源代码分析(二)

    八.Log.scala 日志类,个人认为是这个包最重要的两个类之一(另一个是LogManager).以伴生对象的方式提供.先说Log object,既然是object,就定义了一些类级别的变量,比如定 ...

  7. 【原创】kafka server源代码分析(二)

    十四.AbstractFetcherManager.scala 该scala定义了两个case类和一个抽象类.两个case类很简单: 1. BrokerAndFectherId:封装了一个broker ...

  8. 【原创】kafka controller源代码分析(二)

    四.TopicDeletionManager.scala 管理topic删除的状态机,具体逻辑如下: TopicCommand发送topic删除命令,在zk的/admin/delete_topics目 ...

  9. HDFS源代码分析(二)-----元数据备份机制

    前言 在Hadoop中,全部的元数据的保存都是在namenode节点之中,每次又一次启动整个集群,Hadoop都须要从这些持久化了的文件里恢复数据到内存中,然后通过镜像和编辑日志文件进行定期的扫描与合 ...

随机推荐

  1. droid开发:如何打开一个.dcm文件作为位图?

    我目前正在做一个Android应用程序的DICOM 继code打开图片DROM RES /绘制的“ussual”图像格式,但它不与.dcm工作 公共类BitmapView扩展视图 { 公共Bitmap ...

  2. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  3. linux下启动、停止tomcat,杀死tomcat进程

    1.打开终端 cd /java/tomcat 2.执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina ...

  4. ansible 批量推送ssh秘钥

    ansible 批量推送ssh秘钥 参考:http://docs.ansible.com/ansible/authorized_key_module.html # vi /etc/ansible/ho ...

  5. Java必知必会的20种常用类库和API

    转载:https://blog.csdn.net/u011001084/article/details/79216958 个人感觉工具类对日常开发是很重要的,所以推荐一下这篇文章,虽然有的类库过时了 ...

  6. 用Docker构建Tomcat镜像

    构建tomcat镜像 创建工作目录 [root@elk-node2 tomcat]# mkdir tomcat [root@elk-node2 tomcat]# cd tomcat [root@elk ...

  7. Executors工厂类

    newCachedThreadPool 重用之前的线程 适合执行许多短期异步任务的程序. 调用 execute() 将重用以前构造的线程 如果没有可用的线程,则创建一个新线程并添加到池中 默认为60s ...

  8. (1) GoJS入门

    GoJS的官方下载,若下载失败,可尝试通过我的个人网盘分享下载. GoJS是一款功能强大,快速且轻量级的流程图控件,可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图,且极大地 ...

  9. [Git]Please make sure you have the correct access rights and the repository exists

    这个问题是这样,需要在已有github账号的A机器上,再创建一个github账号,新账号创建完毕,将代码通过机器A push上之后,再另一台机器B,clone 这个项目时报出了如下错误: Permis ...

  10. Codeforces Round #470 Div. 2题解

    A. Protect Sheep time limit per test 1 second memory limit per test 256 megabytes input standard inp ...