1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sf.ehcache.distribution;
18
19 import net.sf.ehcache.event.CacheEventListener;
20 import net.sf.ehcache.event.CacheEventListenerFactory;
21 import net.sf.ehcache.util.PropertyUtil;
22
23 import java.util.Properties;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class RMICacheReplicatorFactory extends CacheEventListenerFactory {
43
44
45
46
47
48 protected static final int DEFAULT_ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS = 1000;
49
50 private static final Log LOG = LogFactory.getLog(RMICacheReplicatorFactory.class.getName());
51 private static final String REPLICATE_PUTS = "replicatePuts";
52 private static final String REPLICATE_UPDATES = "replicateUpdates";
53 private static final String REPLICATE_UPDATES_VIA_COPY = "replicateUpdatesViaCopy";
54 private static final String REPLICATE_REMOVALS = "replicateRemovals";
55 private static final String REPLICATE_ASYNCHRONOUSLY = "replicateAsynchronously";
56 private static final String ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS = "asynchronousReplicationIntervalMillis";
57 private static final int MINIMUM_REASONABLE_INTERVAL = 10;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 public final CacheEventListener createCacheEventListener(Properties properties) {
88 boolean replicatePuts = extractReplicatePuts(properties);
89 boolean replicateUpdates = extractReplicateUpdates(properties);
90 boolean replicateUpdatesViaCopy = extractReplicateUpdatesViaCopy(properties);
91 boolean replicateRemovals = extractReplicateRemovals(properties);
92 boolean replicateAsynchronously = extractReplicateAsynchronously(properties);
93 int asynchronousReplicationIntervalMillis = extractReplicationIntervalMilis(properties);
94
95 if (replicateAsynchronously) {
96 return new RMIAsynchronousCacheReplicator(
97 replicatePuts,
98 replicateUpdates,
99 replicateUpdatesViaCopy,
100 replicateRemovals,
101 asynchronousReplicationIntervalMillis);
102 } else {
103 return new RMISynchronousCacheReplicator(
104 replicatePuts,
105 replicateUpdates,
106 replicateUpdatesViaCopy,
107 replicateRemovals);
108 }
109 }
110
111
112
113
114
115
116 protected int extractReplicationIntervalMilis(Properties properties) {
117 int asynchronousReplicationIntervalMillis;
118 String asynchronousReplicationIntervalMillisString =
119 PropertyUtil.extractAndLogProperty(ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS, properties);
120 if (asynchronousReplicationIntervalMillisString != null) {
121 try {
122 int asynchronousReplicationIntervalMillisCandidate =
123 Integer.parseInt(asynchronousReplicationIntervalMillisString);
124 if (asynchronousReplicationIntervalMillisCandidate < MINIMUM_REASONABLE_INTERVAL) {
125 LOG.warn("Trying to set the asynchronousReplicationIntervalMillis to an unreasonable number." +
126 " Using the default instead.");
127 asynchronousReplicationIntervalMillis = DEFAULT_ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS;
128 } else {
129 asynchronousReplicationIntervalMillis = asynchronousReplicationIntervalMillisCandidate;
130 }
131 } catch (NumberFormatException e) {
132 LOG.warn("Number format exception trying to set asynchronousReplicationIntervalMillis. " +
133 "Using the default instead. String value was: '" + asynchronousReplicationIntervalMillisString + "'");
134 asynchronousReplicationIntervalMillis = DEFAULT_ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS;
135 }
136 } else {
137 asynchronousReplicationIntervalMillis = DEFAULT_ASYNCHRONOUS_REPLICATION_INTERVAL_MILLIS;
138 }
139 return asynchronousReplicationIntervalMillis;
140 }
141
142
143
144
145
146 protected boolean extractReplicateAsynchronously(Properties properties) {
147 boolean replicateAsynchronously;
148 String replicateAsynchronouslyString = PropertyUtil.extractAndLogProperty(REPLICATE_ASYNCHRONOUSLY, properties);
149 if (replicateAsynchronouslyString != null) {
150 replicateAsynchronously = PropertyUtil.parseBoolean(replicateAsynchronouslyString);
151 } else {
152 replicateAsynchronously = true;
153 }
154 return replicateAsynchronously;
155 }
156
157
158
159
160
161 protected boolean extractReplicateRemovals(Properties properties) {
162 boolean replicateRemovals;
163 String replicateRemovalsString = PropertyUtil.extractAndLogProperty(REPLICATE_REMOVALS, properties);
164 if (replicateRemovalsString != null) {
165 replicateRemovals = PropertyUtil.parseBoolean(replicateRemovalsString);
166 } else {
167 replicateRemovals = true;
168 }
169 return replicateRemovals;
170 }
171
172
173
174
175
176 protected boolean extractReplicateUpdatesViaCopy(Properties properties) {
177 boolean replicateUpdatesViaCopy;
178 String replicateUpdatesViaCopyString = PropertyUtil.extractAndLogProperty(REPLICATE_UPDATES_VIA_COPY, properties);
179 if (replicateUpdatesViaCopyString != null) {
180 replicateUpdatesViaCopy = PropertyUtil.parseBoolean(replicateUpdatesViaCopyString);
181 } else {
182 replicateUpdatesViaCopy = true;
183 }
184 return replicateUpdatesViaCopy;
185 }
186
187
188
189
190
191 protected boolean extractReplicateUpdates(Properties properties) {
192 boolean replicateUpdates;
193 String replicateUpdatesString = PropertyUtil.extractAndLogProperty(REPLICATE_UPDATES, properties);
194 if (replicateUpdatesString != null) {
195 replicateUpdates = PropertyUtil.parseBoolean(replicateUpdatesString);
196 } else {
197 replicateUpdates = true;
198 }
199 return replicateUpdates;
200 }
201
202
203
204
205
206 protected boolean extractReplicatePuts(Properties properties) {
207 boolean replicatePuts;
208 String replicatePutsString = PropertyUtil.extractAndLogProperty(REPLICATE_PUTS, properties);
209 if (replicatePutsString != null) {
210 replicatePuts = PropertyUtil.parseBoolean(replicatePutsString);
211 } else {
212 replicatePuts = true;
213 }
214 return replicatePuts;
215 }
216
217
218 }