1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jci.examples.configuration;
19
20 import java.io.File;
21 import java.io.FileInputStream;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.Properties;
26
27 import org.apache.commons.jci.listeners.FileChangeListener;
28 import org.apache.commons.jci.monitor.FilesystemAlterationListener;
29 import org.apache.commons.jci.monitor.FilesystemAlterationMonitor;
30 import org.apache.commons.jci.monitor.FilesystemAlterationObserver;
31
32
33
34
35
36 public final class ConfigurationReloading {
37
38 private final FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
39
40 private void run(String[] args) {
41
42 final File configFile = new File("some.properties");
43
44 System.out.println("Watching " + configFile.getAbsolutePath());
45
46 final Collection configurables = new ArrayList();
47
48 final FilesystemAlterationListener listener = new FileChangeListener() {
49 public void onStop(FilesystemAlterationObserver pObserver) {
50 super.onStop(pObserver);
51
52 if (hasChanged()) {
53 System.out.println("Configuration change detected " + configFile);
54
55 final Properties props = new Properties();
56 try {
57
58 props.load(new FileInputStream(configFile));
59
60 System.out.println("Notifying about configuration change " + configFile);
61
62 for (Iterator it = configurables.iterator(); it.hasNext();) {
63 final Configurable configurable = (Configurable) it.next();
64 configurable.configure(props);
65 }
66
67 } catch (Exception e) {
68 System.err.println("Failed to load configuration " + configFile);
69 }
70
71 }
72 }
73 };
74
75 fam.addListener(configFile, listener);
76 fam.start();
77
78 configurables.add(new Something());
79
80 while(true) {
81 try {
82 Thread.sleep(1000);
83 } catch (InterruptedException e) {
84 }
85 }
86 }
87
88 public static void main(String[] args) {
89 new ConfigurationReloading().run(args);
90 }
91 }