1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.config;
18
19 import java.io.File;
20 import java.util.List;
21
22
23
24
25
26 public class FileConfigurationMonitor implements ConfigurationMonitor {
27
28 private static final int MASK = 0x0f;
29
30 private static final int MIN_INTERVAL = 5;
31
32 private static final int MILLIS_PER_SECOND = 1000;
33
34 private final File file;
35
36 private long lastModified;
37
38 private final List<ConfigurationListener> listeners;
39
40 private final int interval;
41
42 private long nextCheck;
43
44 private volatile int counter = 0;
45
46 private Reconfigurable reconfigurable;
47
48
49
50
51
52
53
54
55 public FileConfigurationMonitor(Reconfigurable reconfigurable, File file, List<ConfigurationListener> listeners,
56 int interval) {
57 this.reconfigurable = reconfigurable;
58 this.file = file;
59 this.lastModified = file.lastModified();
60 this.listeners = listeners;
61 this.interval = (interval < MIN_INTERVAL ? MIN_INTERVAL : interval) * MILLIS_PER_SECOND;
62 this.nextCheck = System.currentTimeMillis() + interval;
63 }
64
65
66
67
68 public void checkConfiguration() {
69 if ((++counter & MASK) == 0) {
70 synchronized (this) {
71 long current = System.currentTimeMillis();
72 if (current >= nextCheck) {
73 nextCheck = current + interval;
74 if (file.lastModified() > lastModified) {
75 lastModified = file.lastModified();
76 for (ConfigurationListener listener : listeners) {
77 listener.onChange(reconfigurable);
78 }
79 }
80 }
81 }
82 }
83 }
84 }