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 final Reconfigurable reconfigurable;
47
48
49
50
51
52
53
54
55 public FileConfigurationMonitor(final Reconfigurable reconfigurable, final File file,
56 final List<ConfigurationListener> listeners,
57 final int interval) {
58 this.reconfigurable = reconfigurable;
59 this.file = file;
60 this.lastModified = file.lastModified();
61 this.listeners = listeners;
62 this.interval = (interval < MIN_INTERVAL ? MIN_INTERVAL : interval) * MILLIS_PER_SECOND;
63 this.nextCheck = System.currentTimeMillis() + interval;
64 }
65
66
67
68
69 public void checkConfiguration() {
70 if ((++counter & MASK) == 0) {
71 synchronized (this) {
72 final long current = System.currentTimeMillis();
73 if (current >= nextCheck) {
74 nextCheck = current + interval;
75 if (file.lastModified() > lastModified) {
76 lastModified = file.lastModified();
77 for (final ConfigurationListener listener : listeners) {
78 listener.onChange(reconfigurable);
79 }
80 }
81 }
82 }
83 }
84 }
85 }