1 | <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
|
---|
2 |
|
---|
3 | <!--
|
---|
4 | CacheManager Configuration
|
---|
5 | ==========================
|
---|
6 | An ehcache.xml corresponds to a single CacheManager.
|
---|
7 |
|
---|
8 | See instructions below or the ehcache schema (ehcache.xsd) on how to configure.
|
---|
9 |
|
---|
10 | DiskStore configuration
|
---|
11 | =======================
|
---|
12 |
|
---|
13 | Sets the path to the directory where cache files are created.
|
---|
14 |
|
---|
15 | If the path is a Java System Property it is replaced by its value in the
|
---|
16 | running VM.
|
---|
17 |
|
---|
18 | The following properties are translated:
|
---|
19 | * user.home - User's home directory
|
---|
20 | * user.dir - User's current working directory
|
---|
21 | * java.io.tmpdir - Default temp file path
|
---|
22 |
|
---|
23 | Subdirectories can be specified below the property e.g. java.io.tmpdir/one
|
---|
24 | -->
|
---|
25 | <diskStore path="java.io.tmpdir"/>
|
---|
26 |
|
---|
27 | <!--
|
---|
28 | CacheManagerEventListener
|
---|
29 | =========================
|
---|
30 | Specifies a CacheManagerEventListenerFactory, be used to create a CacheManagerPeerProvider,
|
---|
31 | which is notified when Caches are added or removed from the CacheManager.
|
---|
32 |
|
---|
33 | The attributes of CacheManagerEventListenerFactory are:
|
---|
34 | * class - a fully qualified factory class name
|
---|
35 | * properties - comma separated properties having meaning only to the factory.
|
---|
36 |
|
---|
37 | Sets the fully qualified class name to be registered as the CacheManager event listener.
|
---|
38 |
|
---|
39 | The events include:
|
---|
40 | * adding a Cache
|
---|
41 | * removing a Cache
|
---|
42 |
|
---|
43 | Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility
|
---|
44 | of the implementer to safely handle the potential performance and thread safety issues
|
---|
45 | depending on what their listener is doing.
|
---|
46 |
|
---|
47 | If no class is specified, no listener is created. There is no default.
|
---|
48 | -->
|
---|
49 | <cacheManagerEventListenerFactory class="" properties=""/>
|
---|
50 |
|
---|
51 |
|
---|
52 | <!--
|
---|
53 | CacheManagerPeerProvider
|
---|
54 | ========================
|
---|
55 | (Enable for distributed operation)
|
---|
56 |
|
---|
57 | Specifies a CacheManagerPeerProviderFactory which will be used to create a
|
---|
58 | CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.
|
---|
59 |
|
---|
60 | The attributes of cacheManagerPeerProviderFactory are:
|
---|
61 | * class - a fully qualified factory class name
|
---|
62 | * properties - comma separated properties having meaning only to the factory.
|
---|
63 |
|
---|
64 | Ehcache comes with a built-in RMI-based distribution system with two means of discovery of
|
---|
65 | CacheManager peers participating in the cluster:
|
---|
66 | * automatic, using a multicast group. This one automatically discovers peers and detects
|
---|
67 | changes such as peers entering and leaving the group
|
---|
68 | * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at
|
---|
69 | configuration time.
|
---|
70 |
|
---|
71 | Configuring Automatic Discovery:
|
---|
72 | Automatic discovery is configured as per the following example:
|
---|
73 | <cacheManagerPeerProviderFactory
|
---|
74 | class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
|
---|
75 | properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
|
---|
76 | multicastGroupPort=4446, timeToLive=32"/>
|
---|
77 |
|
---|
78 | Valid properties are:
|
---|
79 | * peerDiscovery (mandatory) - specify "automatic"
|
---|
80 | * multicastGroupAddress (mandatory) - specify a valid multicast group address
|
---|
81 | * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat
|
---|
82 | traffic
|
---|
83 | * timeToLive - specify a value between 0 and 255 which determines how far the packets will
|
---|
84 | propagate.
|
---|
85 |
|
---|
86 | By convention, the restrictions are:
|
---|
87 | 0 - the same host
|
---|
88 | 1 - the same subnet
|
---|
89 | 32 - the same site
|
---|
90 | 64 - the same region
|
---|
91 | 128 - the same continent
|
---|
92 | 255 - unrestricted
|
---|
93 |
|
---|
94 | Configuring Manual Discovery:
|
---|
95 | Manual discovery is configured as per the following example:
|
---|
96 | <cacheManagerPeerProviderFactory class=
|
---|
97 | "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
|
---|
98 | properties="peerDiscovery=manual,
|
---|
99 | rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
|
---|
100 | | //server1:40000/sampleCache2|//server2:40000/sampleCache2"
|
---|
101 | propertySeparator="," />
|
---|
102 |
|
---|
103 | Valid properties are:
|
---|
104 | * peerDiscovery (mandatory) - specify "manual"
|
---|
105 | * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form
|
---|
106 | //hostname:port
|
---|
107 |
|
---|
108 | The hostname is the hostname of the remote CacheManager peer. The port is the listening
|
---|
109 | port of the RMICacheManagerPeerListener of the remote CacheManager peer.
|
---|
110 |
|
---|
111 | -->
|
---|
112 | <cacheManagerPeerProviderFactory
|
---|
113 | class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
|
---|
114 | properties="peerDiscovery=automatic,
|
---|
115 | multicastGroupAddress=230.0.0.1,
|
---|
116 | multicastGroupPort=4446, timeToLive=1"
|
---|
117 | propertySeparator=","
|
---|
118 | />
|
---|
119 |
|
---|
120 |
|
---|
121 | <!--
|
---|
122 | CacheManagerPeerListener
|
---|
123 | ========================
|
---|
124 | (Enable for distributed operation)
|
---|
125 |
|
---|
126 | Specifies a CacheManagerPeerListenerFactory which will be used to create a
|
---|
127 | CacheManagerPeerListener, which
|
---|
128 | listens for messages from cache replicators participating in the cluster.
|
---|
129 |
|
---|
130 | The attributes of cacheManagerPeerListenerFactory are:
|
---|
131 | class - a fully qualified factory class name
|
---|
132 | properties - comma separated properties having meaning only to the factory.
|
---|
133 |
|
---|
134 | Ehcache comes with a built-in RMI-based distribution system. The listener component is
|
---|
135 | RMICacheManagerPeerListener which is configured using
|
---|
136 | RMICacheManagerPeerListenerFactory. It is configured as per the following example:
|
---|
137 |
|
---|
138 | <cacheManagerPeerListenerFactory
|
---|
139 | class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
|
---|
140 | properties="hostName=fully_qualified_hostname_or_ip,
|
---|
141 | port=40001,
|
---|
142 | socketTimeoutMillis=120000"
|
---|
143 | propertySeparator="," />
|
---|
144 |
|
---|
145 | All properties are optional. They are:
|
---|
146 | * hostName - the hostName of the host the listener is running on. Specify
|
---|
147 | where the host is multihomed and you want to control the interface over which cluster
|
---|
148 | messages are received. Defaults to the host name of the default interface if not
|
---|
149 | specified.
|
---|
150 | * port - the port the listener listens on. This defaults to a free port if not specified.
|
---|
151 | * socketTimeoutMillis - the number of ms client sockets will stay open when sending
|
---|
152 | messages to the listener. This should be long enough for the slowest message.
|
---|
153 | If not specified it defaults 120000ms.
|
---|
154 |
|
---|
155 | -->
|
---|
156 | <cacheManagerPeerListenerFactory
|
---|
157 | class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
|
---|
158 |
|
---|
159 |
|
---|
160 | <!--
|
---|
161 | Cache configuration
|
---|
162 | ===================
|
---|
163 |
|
---|
164 | The following attributes are required.
|
---|
165 |
|
---|
166 | name:
|
---|
167 | Sets the name of the cache. This is used to identify the cache. It must be unique.
|
---|
168 |
|
---|
169 | maxElementsInMemory:
|
---|
170 | Sets the maximum number of objects that will be created in memory
|
---|
171 |
|
---|
172 | maxElementsOnDisk:
|
---|
173 | Sets the maximum number of objects that will be maintained in the DiskStore
|
---|
174 | The default value is zero, meaning unlimited.
|
---|
175 |
|
---|
176 | eternal:
|
---|
177 | Sets whether elements are eternal. If eternal, timeouts are ignored and the
|
---|
178 | element is never expired.
|
---|
179 |
|
---|
180 | overflowToDisk:
|
---|
181 | Sets whether elements can overflow to disk when the memory store
|
---|
182 | has reached the maxInMemory limit.
|
---|
183 |
|
---|
184 | The following attributes and elements are optional.
|
---|
185 |
|
---|
186 | timeToIdleSeconds:
|
---|
187 | Sets the time to idle for an element before it expires.
|
---|
188 | i.e. The maximum amount of time between accesses before an element expires
|
---|
189 | Is only used if the element is not eternal.
|
---|
190 | Optional attribute. A value of 0 means that an Element can idle for infinity.
|
---|
191 | The default value is 0.
|
---|
192 |
|
---|
193 | timeToLiveSeconds:
|
---|
194 | Sets the time to live for an element before it expires.
|
---|
195 | i.e. The maximum time between creation time and when an element expires.
|
---|
196 | Is only used if the element is not eternal.
|
---|
197 | Optional attribute. A value of 0 means that and Element can live for infinity.
|
---|
198 | The default value is 0.
|
---|
199 |
|
---|
200 | diskPersistent:
|
---|
201 | Whether the disk store persists between restarts of the Virtual Machine.
|
---|
202 | The default value is false.
|
---|
203 |
|
---|
204 | diskExpiryThreadIntervalSeconds:
|
---|
205 | The number of seconds between runs of the disk expiry thread. The default value
|
---|
206 | is 120 seconds.
|
---|
207 |
|
---|
208 | diskSpoolBufferSizeMB:
|
---|
209 | This is the size to allocate the DiskStore for a spool buffer. Writes are made
|
---|
210 | to this area and then asynchronously written to disk. The default size is 30MB.
|
---|
211 | Each spool buffer is used only by its cache. If you get OutOfMemory errors consider
|
---|
212 | lowering this value. To improve DiskStore performance consider increasing it. Trace level
|
---|
213 | logging in the DiskStore will show if put back ups are occurring.
|
---|
214 |
|
---|
215 | memoryStoreEvictionPolicy:
|
---|
216 | Policy would be enforced upon reaching the maxElementsInMemory limit. Default
|
---|
217 | policy is Least Recently Used (specified as LRU). Other policies available -
|
---|
218 | First In First Out (specified as FIFO) and Less Frequently Used
|
---|
219 | (specified as LFU)
|
---|
220 |
|
---|
221 | Cache elements can also contain sub elements which take the same format of a factory class
|
---|
222 | and properties. Defined sub-elements are:
|
---|
223 |
|
---|
224 | * cacheEventListenerFactory - Enables registration of listeners for cache events, such as
|
---|
225 | put, remove, update, and expire.
|
---|
226 |
|
---|
227 | * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader, which is called by a
|
---|
228 | cache on initialisation to prepopulate itself.
|
---|
229 |
|
---|
230 | * cacheExtensionFactory - Specifies a CacheExtension, a generic mechansim to tie a class
|
---|
231 | which holds a reference to a cache to the cache lifecycle.
|
---|
232 |
|
---|
233 | * cacheExceptionHandlerFactory - Specifies a CacheExceptionHandler, which is called when
|
---|
234 | cache exceptions occur.
|
---|
235 |
|
---|
236 | * cacheLoaderFactory - Specifies a CacheLoader, which can be used both asynchronously and
|
---|
237 | synchronously to load objects into a cache.
|
---|
238 |
|
---|
239 | RMI Cache Replication
|
---|
240 |
|
---|
241 | Each cache that will be distributed needs to set a cache event listener which replicates
|
---|
242 | messages to the other CacheManager peers. For the built-in RMI implementation this is done
|
---|
243 | by adding a cacheEventListenerFactory element of type RMICacheReplicatorFactory to each
|
---|
244 | distributed cache's configuration as per the following example:
|
---|
245 |
|
---|
246 | <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
|
---|
247 | properties="replicateAsynchronously=true,
|
---|
248 | replicatePuts=true,
|
---|
249 | replicateUpdates=true,
|
---|
250 | replicateUpdatesViaCopy=true,
|
---|
251 | replicateRemovals=true
|
---|
252 | asynchronousReplicationIntervalMillis=<number of milliseconds"
|
---|
253 | propertySeparator="," />
|
---|
254 |
|
---|
255 | The RMICacheReplicatorFactory recognises the following properties:
|
---|
256 |
|
---|
257 | * replicatePuts=true|false - whether new elements placed in a cache are
|
---|
258 | replicated to others. Defaults to true.
|
---|
259 |
|
---|
260 | * replicateUpdates=true|false - whether new elements which override an
|
---|
261 | element already existing with the same key are replicated. Defaults to true.
|
---|
262 |
|
---|
263 | * replicateRemovals=true - whether element removals are replicated. Defaults to true.
|
---|
264 |
|
---|
265 | * replicateAsynchronously=true | false - whether replications are
|
---|
266 | asynchronous (true) or synchronous (false). Defaults to true.
|
---|
267 |
|
---|
268 | * replicateUpdatesViaCopy=true | false - whether the new elements are
|
---|
269 | copied to other caches (true), or whether a remove message is sent. Defaults to true.
|
---|
270 |
|
---|
271 | * asynchronousReplicationIntervalMillis=<number of milliseconds> - The asynchronous
|
---|
272 | replicator runs at a set interval of milliseconds. The default is 1000. The minimum
|
---|
273 | is 10. This property is only applicable if replicateAsynchronously=true
|
---|
274 |
|
---|
275 |
|
---|
276 | Cluster Bootstrapping
|
---|
277 |
|
---|
278 | The RMIBootstrapCacheLoader bootstraps caches in clusters where RMICacheReplicators are
|
---|
279 | used. It is configured as per the following example:
|
---|
280 |
|
---|
281 | <bootstrapCacheLoaderFactory
|
---|
282 | class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
|
---|
283 | properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"
|
---|
284 | propertySeparator="," />
|
---|
285 |
|
---|
286 | The RMIBootstrapCacheLoaderFactory recognises the following optional properties:
|
---|
287 |
|
---|
288 | * bootstrapAsynchronously=true|false - whether the bootstrap happens in the background
|
---|
289 | after the cache has started. If false, bootstrapping must complete before the cache is
|
---|
290 | made available. The default value is true.
|
---|
291 |
|
---|
292 | * maximumChunkSizeBytes=<integer> - Caches can potentially be very large, larger than the
|
---|
293 | memory limits of the VM. This property allows the bootstraper to fetched elements in
|
---|
294 | chunks. The default chunk size is 5000000 (5MB).
|
---|
295 |
|
---|
296 |
|
---|
297 | Cache Exception Handling
|
---|
298 |
|
---|
299 | By default, most cache operations will propagate a runtime CacheException on failure. An
|
---|
300 | interceptor, using a dynamic proxy, may be configured so that a CacheExceptionHandler can
|
---|
301 | be configured to intercept Exceptions. Errors are not intercepted.
|
---|
302 |
|
---|
303 | It is configured as per the following example:
|
---|
304 |
|
---|
305 | <cacheExceptionHandlerFactory class="com.example.ExampleExceptionHandlerFactory"
|
---|
306 | properties="logLevel=FINE"/>
|
---|
307 |
|
---|
308 | Caches with ExceptionHandling configured are not of type Cache, but are of type Ehcache only,
|
---|
309 | and are not available using CacheManager.getCache(), but using CacheManager.getEhcache().
|
---|
310 |
|
---|
311 |
|
---|
312 | Cache Loader
|
---|
313 |
|
---|
314 | A default CacheLoader may be set which loads objects into the cache through asynchronous and
|
---|
315 | synchronous methods on Cache. This is different to the bootstrap cache loader, which is used
|
---|
316 | only in distributed caching.
|
---|
317 |
|
---|
318 | It is configured as per the following example:
|
---|
319 |
|
---|
320 | <cacheLoaderFactory class="com.example.ExampleCacheLoaderFactory"
|
---|
321 | properties="type=int,startCounter=10"/>
|
---|
322 |
|
---|
323 | Cache Extension
|
---|
324 |
|
---|
325 | CacheExtensions are a general purpose mechanism to allow generic extensions to a Cache.
|
---|
326 | CacheExtensions are tied into the Cache lifecycle.
|
---|
327 |
|
---|
328 | CacheExtensions are created using the CacheExtensionFactory which has a
|
---|
329 | <code>createCacheCacheExtension()</code> method which takes as a parameter a
|
---|
330 | Cache and properties. It can thus call back into any public method on Cache, including, of
|
---|
331 | course, the load methods.
|
---|
332 |
|
---|
333 | Extensions are added as per the following example:
|
---|
334 |
|
---|
335 | <cacheExtensionFactory class="com.example.FileWatchingCacheRefresherExtensionFactory"
|
---|
336 | properties="refreshIntervalMillis=18000, loaderTimeout=3000,
|
---|
337 | flushPeriod=whatever, someOtherProperty=someValue ..."/>
|
---|
338 |
|
---|
339 | -->
|
---|
340 |
|
---|
341 |
|
---|
342 | <!--
|
---|
343 | Mandatory Default Cache configuration. These settings will be applied to caches
|
---|
344 | created programmtically using CacheManager.add(String cacheName).
|
---|
345 |
|
---|
346 | The defaultCache has an implicit name "default" which is a reserved cache name.
|
---|
347 | -->
|
---|
348 | <defaultCache
|
---|
349 | maxElementsInMemory="10000"
|
---|
350 | eternal="false"
|
---|
351 | timeToIdleSeconds="120"
|
---|
352 | timeToLiveSeconds="120"
|
---|
353 | overflowToDisk="true"
|
---|
354 | diskSpoolBufferSizeMB="30"
|
---|
355 | maxElementsOnDisk="10000000"
|
---|
356 | diskPersistent="false"
|
---|
357 | diskExpiryThreadIntervalSeconds="120"
|
---|
358 | memoryStoreEvictionPolicy="LRU"
|
---|
359 | />
|
---|
360 |
|
---|
361 | <!--
|
---|
362 | Sample caches. Following are some example caches. Remove these before use.
|
---|
363 | -->
|
---|
364 |
|
---|
365 | <!--
|
---|
366 | Sample cache named sampleCache1
|
---|
367 | This cache contains a maximum in memory of 10000 elements, and will expire
|
---|
368 | an element if it is idle for more than 5 minutes and lives for more than
|
---|
369 | 10 minutes.
|
---|
370 |
|
---|
371 | If there are more than 10000 elements it will overflow to the
|
---|
372 | disk cache, which in this configuration will go to wherever java.io.tmp is
|
---|
373 | defined on your system. On a standard Linux system this will be /tmp"
|
---|
374 | -->
|
---|
375 | <cache name="sampleCache1"
|
---|
376 | maxElementsInMemory="10000"
|
---|
377 | maxElementsOnDisk="1000"
|
---|
378 | eternal="false"
|
---|
379 | overflowToDisk="true"
|
---|
380 | diskSpoolBufferSizeMB="20"
|
---|
381 | timeToIdleSeconds="300"
|
---|
382 | timeToLiveSeconds="600"
|
---|
383 | memoryStoreEvictionPolicy="LFU"
|
---|
384 | />
|
---|
385 |
|
---|
386 |
|
---|
387 | <!--
|
---|
388 | Sample cache named sampleCache2
|
---|
389 | This cache has a maximum of 1000 elements in memory. There is no overflow to disk, so 1000
|
---|
390 | is also the maximum cache size. Note that when a cache is eternal, timeToLive and
|
---|
391 | timeToIdle are not used and do not need to be specified.
|
---|
392 | -->
|
---|
393 | <cache name="sampleCache2"
|
---|
394 | maxElementsInMemory="1000"
|
---|
395 | eternal="true"
|
---|
396 | overflowToDisk="false"
|
---|
397 | memoryStoreEvictionPolicy="FIFO"
|
---|
398 | />
|
---|
399 |
|
---|
400 |
|
---|
401 | <!--
|
---|
402 | Sample cache named sampleCache3. This cache overflows to disk. The disk store is
|
---|
403 | persistent between cache and VM restarts. The disk expiry thread interval is set to 10
|
---|
404 | minutes, overriding the default of 2 minutes.
|
---|
405 | -->
|
---|
406 | <cache name="sampleCache3"
|
---|
407 | maxElementsInMemory="500"
|
---|
408 | eternal="false"
|
---|
409 | overflowToDisk="true"
|
---|
410 | timeToIdleSeconds="300"
|
---|
411 | timeToLiveSeconds="600"
|
---|
412 | diskPersistent="true"
|
---|
413 | diskExpiryThreadIntervalSeconds="1"
|
---|
414 | memoryStoreEvictionPolicy="LFU"
|
---|
415 | />
|
---|
416 |
|
---|
417 |
|
---|
418 | <!--
|
---|
419 | Sample distributed cache named sampleDistributedCache1.
|
---|
420 | This cache replicates using defaults.
|
---|
421 | It also bootstraps from the cluster, using default properties.
|
---|
422 | -->
|
---|
423 | <cache name="sampleDistributedCache1"
|
---|
424 | maxElementsInMemory="10"
|
---|
425 | eternal="false"
|
---|
426 | timeToIdleSeconds="100"
|
---|
427 | timeToLiveSeconds="100"
|
---|
428 | overflowToDisk="false">
|
---|
429 | <cacheEventListenerFactory
|
---|
430 | class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
|
---|
431 | <bootstrapCacheLoaderFactory
|
---|
432 | class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
|
---|
433 | </cache>
|
---|
434 |
|
---|
435 |
|
---|
436 | <!--
|
---|
437 | Sample distributed cache named sampleDistributedCache2.
|
---|
438 | This cache replicates using specific properties.
|
---|
439 | It only replicates updates and does so synchronously via copy
|
---|
440 | -->
|
---|
441 | <cache name="sampleDistributedCache2"
|
---|
442 | maxElementsInMemory="10"
|
---|
443 | eternal="false"
|
---|
444 | timeToIdleSeconds="100"
|
---|
445 | timeToLiveSeconds="100"
|
---|
446 | overflowToDisk="false">
|
---|
447 | <cacheEventListenerFactory
|
---|
448 | class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
|
---|
449 | properties="replicateAsynchronously=false, replicatePuts=false,
|
---|
450 | replicateUpdates=true, replicateUpdatesViaCopy=true,
|
---|
451 | replicateRemovals=false"/>
|
---|
452 | </cache>
|
---|
453 |
|
---|
454 | <!--
|
---|
455 | Sample distributed cache named sampleDistributedCache3.
|
---|
456 | This cache replicates using defaults except that the asynchronous replication
|
---|
457 | interval is set to 200ms.
|
---|
458 | -->
|
---|
459 | <cache name="sampleDistributedCache3"
|
---|
460 | maxElementsInMemory="10"
|
---|
461 | eternal="false"
|
---|
462 | timeToIdleSeconds="100"
|
---|
463 | timeToLiveSeconds="100"
|
---|
464 | overflowToDisk="false">
|
---|
465 | <cacheEventListenerFactory
|
---|
466 | class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
|
---|
467 | properties="asynchronousReplicationIntervalMillis=200"/>
|
---|
468 | </cache>
|
---|
469 |
|
---|
470 |
|
---|
471 |
|
---|
472 |
|
---|
473 | </ehcache>
|
---|