[infinispan-dev] Christophe's contributions Fwd: [infinispan-commits] Infinispan SVN: r420 - in trunk/core/src: main/resources/xslt and 2 other directories.
Galder Zamarreno
galder.zamarreno at redhat.com
Tue Jun 16 11:20:23 EDT 2009
Welcome Christophe to the Infinispan 'familia' :)
Manik Surtani wrote:
> Congrats on your first contribution, Christophe! The first of many, I
> hope.
>
> Begin forwarded message:
>
>> From: infinispan-commits at lists.jboss.org
>> Date: 9 June 2009 22:29:03 BST
>> To: infinispan-commits at lists.jboss.org
>> Subject: [infinispan-commits] Infinispan SVN: r420 - in
>> trunk/core/src: main/resources/xslt and 2 other directories.
>> Reply-To: infinispan-commits at lists.jboss.org
>>
>> Author: chivert
>> Date: 2009-06-09 17:29:03 -0400 (Tue, 09 Jun 2009)
>> New Revision: 420
>>
>> Added:
>> trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt
>> trunk/core/src/test/resources/configs/ehcache16/
>>
>> trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml
>> trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd
>> Modified:
>>
>> trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java
>>
>> Log:
>> [ISPN-56] (Create migration script for EHCache) Adding style sheet for
>> Ehcache configuration.
>> Changing ConfigFilesConvertor to use this stylesheet.
>> Adding Ehcache configuration examples and xsd for unit test. The unit
>> test is not included in this change list though.
>>
>>
>> Modified:
>> trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java
>>
>> ===================================================================
>> ---
>> trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java
>> 2009-06-09 15:55:01 UTC (rev 419)
>> +++
>> trunk/core/src/main/java/org/infinispan/config/parsing/ConfigFilesConvertor.java
>> 2009-06-09 21:29:03 UTC (rev 420)
>> @@ -53,9 +53,9 @@
>> */
>> public class ConfigFilesConvertor {
>>
>> -
>> private static final String JBOSS_CACHE3X = "JBossCache3x";
>> - public static final String[] SUPPORTED_FORMATS = {JBOSS_CACHE3X};
>> + private static final String EHCACHE_CACHE16X = "Ehcache16x";
>> + public static final String[] SUPPORTED_FORMATS = {JBOSS_CACHE3X,
>> EHCACHE_CACHE16X};
>>
>> public void parse(InputStream is, OutputStream os, String xsltFile)
>> throws Exception {
>> InputStream xsltInStream = new FileLookup().lookupFile(xsltFile);
>> @@ -136,6 +136,8 @@
>>
>> if (type.equals(JBOSS_CACHE3X)) {
>> transformFromJbossCache3x(sourceName, destinationName);
>> + } else if (type.equals(EHCACHE_CACHE16X)) {
>> + transformFromEhcache16x(sourceName, destinationName);
>> }
>>
>> System.out.println("---");
>> @@ -143,6 +145,7 @@
>> System.out.println("---");
>> }
>>
>> +
>> private static void mustExist(String sourceName, String what) {
>> if (sourceName == null) {
>> System.err.println("Missing '" + what + "', cannot proceed");
>> @@ -182,6 +185,28 @@
>> }
>> }
>>
>> + private static void transformFromEhcache16x(String sourceName,
>> String destinationName) throws Exception {
>> + File oldConfig = new File(sourceName);
>> + if (!oldConfig.exists()) {
>> + System.err.println("File specified as input ('" + sourceName
>> + ") does not exist.");
>> + System.exit(1);
>> + }
>> + ConfigFilesConvertor convertor = new ConfigFilesConvertor();
>> + FileInputStream is = new FileInputStream(oldConfig);
>> + File destination = new File(destinationName);
>> + if (!destination.exists()) {
>> + destination.createNewFile();
>> + }
>> +
>> + FileOutputStream fos = new FileOutputStream(destinationName);
>> + try {
>> + convertor.parse(is, fos, "xslt/ehcache16x2infinispan4x.xslt");
>> + } finally {
>> + fos.close();
>> + is.close();
>> + }
>> + }
>> +
>> private Transformer getTransformer(InputStream xsltInStream) throws
>> TransformerConfigurationException {
>> TransformerFactory tFactory = TransformerFactory.newInstance();
>> StreamSource stylesource = new StreamSource(xsltInStream);
>>
>> Added: trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt
>> ===================================================================
>> ---
>> trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt
>> (rev 0)
>> +++ trunk/core/src/main/resources/xslt/ehcache16x2infinispan4x.xslt
>> 2009-06-09 21:29:03 UTC (rev 420)
>> @@ -0,0 +1,145 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +
>> +<xsl:stylesheet xmlns="urn:infinispan:config:4.0"
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
>> + <xsl:output method="xml" indent="yes" version="1.0"
>> encoding="UTF-8" omit-xml-declaration="no"/>
>> + <xsl:template match="/ehcache">
>> + <xsl:comment>
>> + This XSL stylesheet is used to convert an Ehcache 1.6.x
>> configuration into an Infinispan 4.0.x configuration.
>> + Note that Infinispan supports JGroups only, caches are
>> migrated to using JGroups.
>> + Peer discovery will also be using JGroups. Eviction policies
>> are translated to LRU, FIFO or NONE.
>> + </xsl:comment>
>> + <xsl:element name="infinispan">
>> +
>> + <xsl:element name="global">
>> + <xsl:element name="asyncListenerExecutor">
>> + <xsl:attribute
>> name="factory">org.infinispan.executors.DefaultExecutorFactory</xsl:attribute>
>>
>> + <property name="threadNamePrefix"
>> value="AsyncListenerThread"/>
>> + </xsl:element>
>> +
>> + <xsl:element name="asyncSerializationExecutor">
>> + <xsl:attribute
>> name="factory">org.infinispan.executors.DefaultExecutorFactory</xsl:attribute>
>>
>> + <property name="threadNamePrefix"
>> value="AsyncSerializationThread"/>
>> + </xsl:element>
>> +
>> + <evictionScheduledExecutor
>> factory="org.infinispan.executors.DefaultScheduledExecutorFactory">
>> + <property name="threadNamePrefix"
>> value="EvictionThread"/>
>> + </evictionScheduledExecutor>
>> +
>> + <replicationQueueScheduledExecutor
>> factory="org.infinispan.executors.DefaultScheduledExecutorFactory">
>> + <property name="threadNamePrefix"
>> value="ReplicationQueueThread"/>
>> + </replicationQueueScheduledExecutor>
>> +
>> + <xsl:element name="globalJmxStatistics">
>> + <xsl:attribute
>> name="jmxDomain">infinispan</xsl:attribute>
>> + <xsl:attribute name="enabled">
>> + <xsl:text>true</xsl:text>
>> + </xsl:attribute>
>> + </xsl:element>
>> +
>> + <xsl:element name="shutdown">
>> + <xsl:attribute name="hookBehavior">
>> + <xsl:text>DEFAULT</xsl:text>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:element>
>> +
>> + <xsl:element name="default">
>> + <xsl:if test="defaultCache[@memoryStoreEvictionPolicy]">
>> + <xsl:if
>> test="contains(defaultCache[@memoryStoreEvictionPolicy], 'LRU')">
>> + <xsl:element name="eviction">
>> + <xsl:attribute name="strategy">
>> + <xsl:value-of
>> select="defaultCache/@memoryStoreEvictionPolicy"/>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:if>
>> + <xsl:if
>> test="contains(defaultCache[@memoryStoreEvictionPolicy], 'FIFO')">
>> + <xsl:element name="eviction">
>> + <xsl:attribute name="strategy">
>> + <xsl:value-of
>> select="defaultCache/@memoryStoreEvictionPolicy"/>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:if>
>> + <xsl:if
>> test="contains(defaultCache[@memoryStoreEvictionPolicy], 'LFU')">
>> + <xsl:message terminate="no">WARNING!!! Infinispan
>> does not support LFU eviction. Using LRU instead.
>> + </xsl:message>
>> + <xsl:element name="eviction">
>> + <xsl:attribute name="strategy">
>> + <xsl:text>LRU</xsl:text>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:if>
>> + </xsl:if>
>> +
>> + </xsl:element>
>> + <xsl:for-each select="cache">
>> + <xsl:element name="namedCache">
>> + <xsl:attribute name="name">
>> + <xsl:value-of select="@name"/>
>> + </xsl:attribute>
>> + <xsl:element name="eviction">
>> + <xsl:attribute name="strategy">
>> + <xsl:choose>
>> + <xsl:when
>> test="contains(@memoryStoreEvictionPolicy, 'LRU')">
>> + <xsl:text>LRU</xsl:text>
>> + </xsl:when>
>> + <xsl:otherwise>
>> + <xsl:choose>
>> + <xsl:when
>> test="contains(@memoryStoreEvictionPolicy, 'FIFO')">
>> + <xsl:text>FIFO</xsl:text>
>> + </xsl:when>
>> + <xsl:otherwise>
>> + <xsl:choose>
>> + <xsl:when
>> test="contains(@memoryStoreEvictionPolicy, 'LFU')">
>> + <xsl:text>LRU</xsl:text>
>> + </xsl:when>
>> + <xsl:otherwise>
>> + <xsl:text>NONE</xsl:text>
>> + </xsl:otherwise>
>> + </xsl:choose>
>> + </xsl:otherwise>
>> + </xsl:choose>
>> + </xsl:otherwise>
>> + </xsl:choose>
>> + </xsl:attribute>
>> + </xsl:element>
>> + <!-- <expiration lifespan="60000" maxIdle="1000" /> -->
>> + <xsl:element name="expiration">
>> +
>> + </xsl:element>
>> +
>> + <xsl:if test="cacheEventListenerFactory">
>> + <xsl:element name="clustering">
>> + <xsl:if
>> test="cacheEventListenerFactory/@properties">
>> + <xsl:attribute name="mode">
>> + <!-- Replication, Invalidation,
>> Distribution-->
>> + <xsl:text>distribution</xsl:text>
>> + </xsl:attribute>
>> + <!-- TODO remove spaces -->
>> + <xsl:choose>
>> + <xsl:when
>> test="contains(cacheEventListenerFactory/@properties,
>> 'replicateAsynchronously=false')">
>> + <xsl:element name="sync">
>> + <!-- replQueueInterval="100"
>> replQueueMaxElements="200" ?? -->
>> + <xsl:attribute name="useReplQueue">
>> + <xsl:text>true</xsl:text>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:when>
>> + <xsl:otherwise>
>> + <xsl:element name="async">
>> + <!-- replQueueInterval="100"
>> replQueueMaxElements="200" ?? -->
>> + <xsl:attribute name="useReplQueue">
>> + <xsl:text>true</xsl:text>
>> + </xsl:attribute>
>> + </xsl:element>
>> + </xsl:otherwise>
>> + </xsl:choose>
>> + </xsl:if>
>> + </xsl:element>
>> + </xsl:if>
>> + </xsl:element>
>> + </xsl:for-each>
>> + </xsl:element>
>> +
>> +
>> + </xsl:template>
>> +</xsl:stylesheet>
>>
>> Added:
>> trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml
>> ===================================================================
>> ---
>> trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml
>> (rev 0)
>> +++
>> trunk/core/src/test/resources/configs/ehcache16/ehcache-configuration.xml
>> 2009-06-09 21:29:03 UTC (rev 420)
>> @@ -0,0 +1,584 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +
>> +<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> + xsi:noNamespaceSchemaLocation="ehcache.xsd" >
>> +
>> + <!--
>> + CacheManager Configuration
>> + ==========================
>> + An ehcache.xml corresponds to a single CacheManager.
>> +
>> + See instructions below or the ehcache schema (ehcache.xsd) on how
>> to configure.
>> +
>> + System property tokens can be specified in this file which are
>> replaced when the configuration
>> + is loaded. For example multicastGroupPort=${multicastGroupPort}
>> can be replaced with the
>> + System property either from an environment variable or a system
>> property specified with a
>> + command line switch such as -DmulticastGroupPort=4446.
>> +
>> + DiskStore configuration
>> + =======================
>> +
>> + The diskStore element is optional. To turn off disk store path
>> creation, comment out the diskStore
>> + element below.
>> +
>> + Configure it if you have overflowToDisk or diskPersistent enabled
>> for any cache.
>> +
>> + If it is not configured, and a cache is created which requires a
>> disk store, a warning will be
>> + issued and java.io.tmpdir will automatically be used.
>> +
>> + diskStore has only one attribute - "path". It is the path to the
>> directory where
>> + .data and .index files will be created.
>> +
>> + If the path is one of the following Java System Property it is
>> replaced by its value in the
>> + running VM. For backward compatibility these are not specified
>> without being enclosed in the ${token}
>> + replacement syntax.
>> +
>> + The following properties are translated:
>> + * user.home - User's home directory
>> + * user.dir - User's current working directory
>> + * java.io.tmpdir - Default temp file path
>> + * ehcache.disk.store.dir - A system property you would normally
>> specify on the command line
>> + e.g. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...
>> +
>> + Subdirectories can be specified below the property e.g.
>> java.io.tmpdir/one
>> + -->
>> + <diskStore path="java.io.tmpdir"/>
>> +
>> + <!--
>> + CacheManagerEventListener
>> + =========================
>> + Specifies a CacheManagerEventListenerFactory which is notified
>> when Caches are added
>> + or removed from the CacheManager.
>> +
>> + The attributes of CacheManagerEventListenerFactory are:
>> + * class - a fully qualified factory class name
>> + * properties - comma separated properties having meaning only to
>> the factory.
>> +
>> + Sets the fully qualified class name to be registered as the
>> CacheManager event listener.
>> +
>> + The events include:
>> + * adding a Cache
>> + * removing a Cache
>> +
>> + Callbacks to listener methods are synchronous and unsynchronized.
>> It is the responsibility
>> + of the implementer to safely handle the potential performance and
>> thread safety issues
>> + depending on what their listener is doing.
>> +
>> + If no class is specified, no listener is created. There is no
>> default.
>> + -->
>> + <cacheManagerEventListenerFactory class="" properties=""/>
>> +
>> +
>> + <!--
>> + CacheManagerPeerProvider
>> + ========================
>> + (For distributed operation)
>> +
>> + Specifies a CacheManagerPeerProviderFactory which will be used to
>> create a
>> + CacheManagerPeerProvider, which discovers other CacheManagers in
>> the cluster.
>> +
>> + One or more providers can be configured. The first one in the
>> ehcache.xml is the default, which is used
>> + for replication and bootstrapping.
>> +
>> + The attributes of cacheManagerPeerProviderFactory are:
>> + * class - a fully qualified factory class name
>> + * properties - comma separated properties having meaning only to
>> the factory.
>> +
>> + Providers are available for RMI, JGroups and JMS as shown following.
>> +
>> + RMICacheManagerPeerProvider
>> + +++++++++++++++++++++++++++
>> +
>> + Ehcache comes with a built-in RMI-based distribution system with
>> two means of discovery of
>> + CacheManager peers participating in the cluster:
>> + * automatic, using a multicast group. This one automatically
>> discovers peers and detects
>> + changes such as peers entering and leaving the group
>> + * manual, using manual rmiURL configuration. A hardcoded list of
>> peers is provided at
>> + configuration time.
>> +
>> + Configuring Automatic Discovery:
>> + Automatic discovery is configured as per the following example:
>> + <cacheManagerPeerProviderFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
>> + properties="peerDiscovery=automatic,
>> multicastGroupAddress=230.0.0.1,
>> + multicastGroupPort=4446,
>> timeToLive=32"/>
>> +
>> + Valid properties are:
>> + * peerDiscovery (mandatory) - specify "automatic"
>> + * multicastGroupAddress (mandatory) - specify a valid multicast
>> group address
>> + * multicastGroupPort (mandatory) - specify a dedicated port for
>> the multicast heartbeat
>> + traffic
>> + * timeToLive - specify a value between 0 and 255 which determines
>> how far the packets will
>> + propagate.
>> +
>> + By convention, the restrictions are:
>> + 0 - the same host
>> + 1 - the same subnet
>> + 32 - the same site
>> + 64 - the same region
>> + 128 - the same continent
>> + 255 - unrestricted
>> +
>> + Configuring Manual Discovery:
>> + Manual discovery is configured as per the following example:
>> + <cacheManagerPeerProviderFactory class=
>> +
>> "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
>> + properties="peerDiscovery=manual,
>> +
>> rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
>> + |
>> //server1:40000/sampleCache2|//server2:40000/sampleCache2"
>> + propertySeparator="," />
>> +
>> + Valid properties are:
>> + * peerDiscovery (mandatory) - specify "manual"
>> + * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls,
>> in the form
>> + //hostname:port
>> +
>> + The hostname is the hostname of the remote CacheManager peer. The
>> port is the listening
>> + port of the RMICacheManagerPeerListener of the remote
>> CacheManager peer.
>> +
>> + JGroupsCacheManagerPeerProvider
>> + +++++++++++++++++++++++++++++++
>> + <cacheManagerPeerProviderFactory
>> class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
>>
>> +
>> properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;
>>
>> +
>> mcast_send_buf_size=150000;mcast_recv_buf_size=80000):
>> +
>> PING(timeout=2000;num_initial_members=6):
>> +
>> MERGE2(min_interval=5000;max_interval=10000):
>> +
>> FD_SOCK:VERIFY_SUSPECT(timeout=1500):
>> +
>> pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):
>> + UNICAST(timeout=5000):
>> +
>> pbcast.STABLE(desired_avg_gossip=20000):
>> + FRAG:
>> +
>> pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)"
>>
>> + propertySeparator="::"
>> + />
>> + The only property necessary is the connect String used by
>> jgroups to configure itself. Refer to the Jgroups documentation for
>> explanation
>> + of all the protocols. The example above uses UDP multicast. If
>> the connect property is not specified the default JGroups connection
>> will be
>> + used.
>> +
>> +
>> + JMSCacheManagerPeerProviderFactory
>> + ++++++++++++++++++++++++++++++++++
>> + <cacheManagerPeerProviderFactory
>> +
>> class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
>>
>> + properties="..."
>> + propertySeparator=","
>> + />
>> +
>> + The JMS PeerProviderFactory uses JNDI to maintain message queue
>> independence. Refer to the manual for full configuration
>> + examples using ActiveMQ and Open Message Queue.
>> +
>> + Valid properties are:
>> + * initialContextFactoryName (mandatory) - the name of the factory
>> used to create the message queue initial context.
>> + * providerURL (mandatory) - the JNDI configuration information
>> for the service provider to use.
>> + * topicConnectionFactoryBindingName (mandatory) - the JNDI
>> binding name for the TopicConnectionFactory
>> + * topicBindingName (mandatory) - the JNDI binding name for the
>> topic name
>> + * getQueueBindingName (mandatory only if using jmsCacheLoader) -
>> the JNDI binding name for the queue name
>> + * securityPrincipalName - the JNDI java.naming.security.principal
>> + * securityCredentials - the JNDI java.naming.security.credentials
>> + * urlPkgPrefixes - the JNDI java.naming.factory.url.pkgs
>> + * userName - the user name to use when creating the
>> TopicConnection to the Message Queue
>> + * password - the password to use when creating the
>> TopicConnection to the Message Queue
>> + * acknowledgementMode - the JMS Acknowledgement mode for both
>> publisher and subscriber. The available choices are
>> + AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE and
>> SESSION_TRANSACTED. The default is AUTO_ACKNOWLEDGE.
>> + -->
>> +
>> + <cacheManagerPeerProviderFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
>> + properties="peerDiscovery=automatic,
>> + multicastGroupAddress=230.0.0.1,
>> + multicastGroupPort=4446, timeToLive=1"
>> + propertySeparator=","
>> + />
>> +
>> +
>> + <!--
>> + CacheManagerPeerListener
>> + ========================
>> + (Enable for distributed operation)
>> +
>> + Specifies a CacheManagerPeerListenerFactory which will be used to
>> create a
>> + CacheManagerPeerListener, which
>> + listens for messages from cache replicators participating in the
>> cluster.
>> +
>> + The attributes of cacheManagerPeerListenerFactory are:
>> + class - a fully qualified factory class name
>> + properties - comma separated properties having meaning only to
>> the factory.
>> +
>> + Ehcache comes with a built-in RMI-based distribution system. The
>> listener component is
>> + RMICacheManagerPeerListener which is configured using
>> + RMICacheManagerPeerListenerFactory. It is configured as per the
>> following example:
>> +
>> + <cacheManagerPeerListenerFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
>> + properties="hostName=fully_qualified_hostname_or_ip,
>> + port=40001,
>> + remoteObjectPort=40002,
>> + socketTimeoutMillis=120000"
>> + propertySeparator="," />
>> +
>> + All properties are optional. They are:
>> + * hostName - the hostName of the host the listener is running on.
>> Specify
>> + where the host is multihomed and you want to control the
>> interface over which cluster
>> + messages are received. Defaults to the host name of the default
>> interface if not
>> + specified.
>> + * port - the port the RMI Registry listener listens on. This
>> defaults to a free port if not specified.
>> + * remoteObjectPort - the port number on which the remote objects
>> bound in the registry receive calls.
>> + This defaults to a free port if not specified.
>> + * socketTimeoutMillis - the number of ms client sockets will stay
>> open when sending
>> + messages to the listener. This should be long enough for the
>> slowest message.
>> + If not specified it defaults to 120000ms.
>> +
>> + -->
>> + <cacheManagerPeerListenerFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
>> +
>> +
>> + <!--
>> + Cache configuration
>> + ===================
>> +
>> + The following attributes are required.
>> +
>> + name:
>> + Sets the name of the cache. This is used to identify the cache.
>> It must be unique.
>> +
>> + maxElementsInMemory:
>> + Sets the maximum number of objects that will be created in memory
>> +
>> + maxElementsOnDisk:
>> + Sets the maximum number of objects that will be maintained in the
>> DiskStore
>> + The default value is zero, meaning unlimited.
>> +
>> + eternal:
>> + Sets whether elements are eternal. If eternal, timeouts are
>> ignored and the
>> + element is never expired.
>> +
>> + overflowToDisk:
>> + Sets whether elements can overflow to disk when the memory store
>> + has reached the maxInMemory limit.
>> +
>> + The following attributes and elements are optional.
>> +
>> + timeToIdleSeconds:
>> + Sets the time to idle for an element before it expires.
>> + i.e. The maximum amount of time between accesses before an
>> element expires
>> + Is only used if the element is not eternal.
>> + Optional attribute. A value of 0 means that an Element can idle
>> for infinity.
>> + The default value is 0.
>> +
>> + timeToLiveSeconds:
>> + Sets the time to live for an element before it expires.
>> + i.e. The maximum time between creation time and when an element
>> expires.
>> + Is only used if the element is not eternal.
>> + Optional attribute. A value of 0 means that and Element can live
>> for infinity.
>> + The default value is 0.
>> +
>> + diskPersistent:
>> + Whether the disk store persists between restarts of the Virtual
>> Machine.
>> + The default value is false.
>> +
>> + diskExpiryThreadIntervalSeconds:
>> + The number of seconds between runs of the disk expiry thread. The
>> default value
>> + is 120 seconds.
>> +
>> + diskSpoolBufferSizeMB:
>> + This is the size to allocate the DiskStore for a spool buffer.
>> Writes are made
>> + to this area and then asynchronously written to disk. The default
>> size is 30MB.
>> + Each spool buffer is used only by its cache. If you get
>> OutOfMemory errors consider
>> + lowering this value. To improve DiskStore performance consider
>> increasing it. Trace level
>> + logging in the DiskStore will show if put back ups are occurring.
>> +
>> + memoryStoreEvictionPolicy:
>> + Policy would be enforced upon reaching the maxElementsInMemory
>> limit. Default
>> + policy is Least Recently Used (specified as LRU). Other policies
>> available -
>> + First In First Out (specified as FIFO) and Less Frequently Used
>> + (specified as LFU)
>> +
>> + Cache elements can also contain sub elements which take the same
>> format of a factory class
>> + and properties. Defined sub-elements are:
>> +
>> + * cacheEventListenerFactory - Enables registration of listeners
>> for cache events, such as
>> + put, remove, update, and expire.
>> +
>> + * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader,
>> which is called by a
>> + cache on initialisation to prepopulate itself.
>> +
>> + * cacheExtensionFactory - Specifies a CacheExtension, a generic
>> mechansim to tie a class
>> + which holds a reference to a cache to the cache lifecycle.
>> +
>> + * cacheExceptionHandlerFactory - Specifies a
>> CacheExceptionHandler, which is called when
>> + cache exceptions occur.
>> +
>> + * cacheLoaderFactory - Specifies a CacheLoader, which can be used
>> both asynchronously and
>> + synchronously to load objects into a cache. More than one
>> cacheLoaderFactory element
>> + can be added, in which case the loaders form a chain which are
>> executed in order. If a
>> + loader returns null, the next in chain is called.
>> +
>> + RMI Cache Replication
>> + +++++++++++++++++++++
>> +
>> + Each cache that will be distributed needs to set a cache event
>> listener which replicates
>> + messages to the other CacheManager peers. For the built-in RMI
>> implementation this is done
>> + by adding a cacheEventListenerFactory element of type
>> RMICacheReplicatorFactory to each
>> + distributed cache's configuration as per the following example:
>> +
>> + <cacheEventListenerFactory
>> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
>> + properties="replicateAsynchronously=true,
>> + replicatePuts=true,
>> + replicatePutsViaCopy=false,
>> + replicateUpdates=true,
>> + replicateUpdatesViaCopy=true,
>> + replicateRemovals=true
>> + asynchronousReplicationIntervalMillis=<number of milliseconds"
>> + propertySeparator="," />
>> +
>> + The RMICacheReplicatorFactory recognises the following properties:
>> +
>> + * replicatePuts=true|false - whether new elements placed in a
>> cache are
>> + replicated to others. Defaults to true.
>> +
>> + * replicatePutsViaCopy=true|false - whether the new elements are
>> + copied to other caches (true), or whether a remove message is
>> sent. Defaults to true.
>> +
>> + * replicateUpdates=true|false - whether new elements which
>> override an
>> + element already existing with the same key are replicated.
>> Defaults to true.
>> +
>> + * replicateRemovals=true - whether element removals are
>> replicated. Defaults to true.
>> +
>> + * replicateAsynchronously=true | false - whether replications are
>> + asynchronous (true) or synchronous (false). Defaults to true.
>> +
>> + * replicateUpdatesViaCopy=true | false - whether the new elements
>> are
>> + copied to other caches (true), or whether a remove message is
>> sent. Defaults to true.
>> +
>> + * asynchronousReplicationIntervalMillis=<number of milliseconds>
>> - The asynchronous
>> + replicator runs at a set interval of milliseconds. The default
>> is 1000. The minimum
>> + is 10. This property is only applicable if
>> replicateAsynchronously=true
>> +
>> +
>> + JGroups Replication
>> + +++++++++++++++++++
>> +
>> + For the Jgroups replication this is done with:
>> + <cacheEventListenerFactory
>> class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
>> + properties="replicateAsynchronously=true,
>> replicatePuts=true,
>> + replicateUpdates=true,
>> replicateUpdatesViaCopy=false,
>> +
>> replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"/>
>> + This listener supports the same properties as the
>> RMICacheReplicationFactory.
>> +
>> +
>> + JMS Replication
>> + +++++++++++++++
>> +
>> + For JMS-based replication this is done with:
>> + <cacheEventListenerFactory
>> +
>> class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory"
>> + properties="replicateAsynchronously=true,
>> + replicatePuts=true,
>> + replicateUpdates=true,
>> + replicateUpdatesViaCopy=true,
>> + replicateRemovals=true,
>> + asynchronousReplicationIntervalMillis=1000"
>> + propertySeparator=","/>
>> +
>> + This listener supports the same properties as the
>> RMICacheReplicationFactory.
>> +
>> + Cluster Bootstrapping
>> + +++++++++++++++++++++
>> + (RMI clusters only)
>> +
>> + The RMIBootstrapCacheLoader bootstraps caches in clusters where
>> RMICacheReplicators are
>> + used. It is configured as per the following example:
>> +
>> + <bootstrapCacheLoaderFactory
>> +
>> class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
>> + properties="bootstrapAsynchronously=true,
>> maximumChunkSizeBytes=5000000"
>> + propertySeparator="," />
>> +
>> + The RMIBootstrapCacheLoaderFactory recognises the following
>> optional properties:
>> +
>> + * bootstrapAsynchronously=true|false - whether the bootstrap
>> happens in the background
>> + after the cache has started. If false, bootstrapping must
>> complete before the cache is
>> + made available. The default value is true.
>> +
>> + * maximumChunkSizeBytes=<integer> - Caches can potentially be
>> very large, larger than the
>> + memory limits of the VM. This property allows the bootstraper
>> to fetched elements in
>> + chunks. The default chunk size is 5000000 (5MB).
>> +
>> +
>> + Cache Exception Handling
>> +
>> + By default, most cache operations will propagate a runtime
>> CacheException on failure. An
>> + interceptor, using a dynamic proxy, may be configured so that a
>> CacheExceptionHandler can
>> + be configured to intercept Exceptions. Errors are not intercepted.
>> +
>> + It is configured as per the following example:
>> +
>> + <cacheExceptionHandlerFactory
>> class="com.example.ExampleExceptionHandlerFactory"
>> + properties="logLevel=FINE"/>
>> +
>> + Caches with ExceptionHandling configured are not of type Cache,
>> but are of type Ehcache only,
>> + and are not available using CacheManager.getCache(), but using
>> CacheManager.getEhcache().
>> +
>> +
>> + Cache Loader
>> +
>> + A default CacheLoader may be set which loads objects into the
>> cache through asynchronous and
>> + synchronous methods on Cache. This is different to the bootstrap
>> cache loader, which is used
>> + only in distributed caching.
>> +
>> + It is configured as per the following example:
>> +
>> + <cacheLoaderFactory
>> class="com.example.ExampleCacheLoaderFactory"
>> +
>> properties="type=int,startCounter=10"/>
>> +
>> + Cache Extension
>> +
>> + CacheExtensions are a general purpose mechanism to allow generic
>> extensions to a Cache.
>> + CacheExtensions are tied into the Cache lifecycle.
>> +
>> + CacheExtensions are created using the CacheExtensionFactory which
>> has a
>> + <code>createCacheCacheExtension()</code> method which takes as a
>> parameter a
>> + Cache and properties. It can thus call back into any public
>> method on Cache, including, of
>> + course, the load methods.
>> +
>> + Extensions are added as per the following example:
>> +
>> + <cacheExtensionFactory
>> class="com.example.FileWatchingCacheRefresherExtensionFactory"
>> + properties="refreshIntervalMillis=18000,
>> loaderTimeout=3000,
>> + flushPeriod=whatever,
>> someOtherProperty=someValue ..."/>
>> +
>> + -->
>> +
>> +
>> + <!--
>> + Mandatory Default Cache configuration. These settings will be
>> applied to caches
>> + created programmtically using CacheManager.add(String cacheName).
>> +
>> + The defaultCache has an implicit name "default" which is a
>> reserved cache name.
>> + -->
>> + <defaultCache
>> + maxElementsInMemory="10000"
>> + eternal="false"
>> + timeToIdleSeconds="120"
>> + timeToLiveSeconds="120"
>> + overflowToDisk="true"
>> + diskSpoolBufferSizeMB="30"
>> + maxElementsOnDisk="10000000"
>> + diskPersistent="false"
>> + diskExpiryThreadIntervalSeconds="120"
>> + memoryStoreEvictionPolicy="LRU"
>> + />
>> +
>> + <!--
>> + Sample caches. Following are some example caches. Remove these
>> before use.
>> + -->
>> +
>> + <!--
>> + Sample cache named sampleCache1
>> + This cache contains a maximum in memory of 10000 elements, and
>> will expire
>> + an element if it is idle for more than 5 minutes and lives for
>> more than
>> + 10 minutes.
>> +
>> + If there are more than 10000 elements it will overflow to the
>> + disk cache, which in this configuration will go to wherever
>> java.io.tmp is
>> + defined on your system. On a standard Linux system this will be
>> /tmp"
>> + -->
>> + <cache name="sampleCache1"
>> + maxElementsInMemory="10000"
>> + maxElementsOnDisk="1000"
>> + eternal="false"
>> + overflowToDisk="true"
>> + diskSpoolBufferSizeMB="20"
>> + timeToIdleSeconds="300"
>> + timeToLiveSeconds="600"
>> + memoryStoreEvictionPolicy="LFU"
>> + />
>> +
>> +
>> + <!--
>> + Sample cache named sampleCache2
>> + This cache has a maximum of 1000 elements in memory. There is no
>> overflow to disk, so 1000
>> + is also the maximum cache size. Note that when a cache is
>> eternal, timeToLive and
>> + timeToIdle are not used and do not need to be specified.
>> + -->
>> + <cache name="sampleCache2"
>> + maxElementsInMemory="1000"
>> + eternal="true"
>> + overflowToDisk="false"
>> + memoryStoreEvictionPolicy="FIFO"
>> + />
>> +
>> +
>> + <!--
>> + Sample cache named sampleCache3. This cache overflows to disk.
>> The disk store is
>> + persistent between cache and VM restarts. The disk expiry thread
>> interval is set to 10
>> + minutes, overriding the default of 2 minutes.
>> + -->
>> +
>> + <cache name="sampleCache3"
>> + maxElementsInMemory="500"
>> + eternal="false"
>> + overflowToDisk="true"
>> + timeToIdleSeconds="300"
>> + timeToLiveSeconds="600"
>> + diskPersistent="true"
>> + diskExpiryThreadIntervalSeconds="1"
>> + memoryStoreEvictionPolicy="LFU"
>> + />
>> +
>> +
>> + <!--
>> + Sample distributed cache named sampleDistributedCache1.
>> + This cache replicates using defaults.
>> + It also bootstraps from the cluster, using default properties.
>> + -->
>> + <cache name="sampleDistributedCache1"
>> + maxElementsInMemory="10"
>> + eternal="false"
>> + timeToIdleSeconds="100"
>> + timeToLiveSeconds="100"
>> + overflowToDisk="false">
>> + <cacheEventListenerFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
>> + <bootstrapCacheLoaderFactory
>> +
>> class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
>> + </cache>
>> +
>> +
>> + <!--
>> + Sample distributed cache named sampleDistributedCache2.
>> + This cache replicates using specific properties.
>> + It only replicates updates and does so synchronously via copy
>> + -->
>> +
>> + <cache name="sampleDistributedCache2"
>> + maxElementsInMemory="10"
>> + eternal="false"
>> + timeToIdleSeconds="100"
>> + timeToLiveSeconds="100"
>> + overflowToDisk="false">
>> + <cacheEventListenerFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
>> + properties="replicateAsynchronously=false,
>> replicatePuts=false,
>> + replicatePutsViaCopy=false,
>> replicateUpdates=true,
>> + replicateUpdatesViaCopy=true,
>> replicateRemovals=false"/>
>> + </cache>
>> +
>> + <!--
>> + Sample distributed cache named sampleDistributedCache3.
>> + This cache replicates using defaults except that the asynchronous
>> replication
>> + interval is set to 200ms.
>> + -->
>> + <cache name="sampleDistributedCache3"
>> + maxElementsInMemory="10"
>> + eternal="false"
>> + timeToIdleSeconds="100"
>> + timeToLiveSeconds="100"
>> + overflowToDisk="false">
>> + <cacheEventListenerFactory
>> +
>> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
>> + properties="asynchronousReplicationIntervalMillis=200"/>
>> + </cache>
>> +
>> +</ehcache>
>>
>> Added: trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd
>> ===================================================================
>> ---
>> trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd
>> (rev 0)
>> +++ trunk/core/src/test/resources/configs/ehcache16/ehcache.xsd
>> 2009-06-09 21:29:03 UTC (rev 420)
>> @@ -0,0 +1,122 @@
>> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>> elementFormDefault="qualified" version="1.6">
>> + <xs:element name="ehcache" >
>> + <xs:complexType>
>> + <xs:sequence>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> ref="diskStore"/>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> + ref="cacheManagerEventListenerFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> + ref="cacheManagerPeerProviderFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> + ref="cacheManagerPeerListenerFactory"/>
>> + <xs:element ref="defaultCache"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cache"/>
>> + </xs:sequence>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="diskStore">
>> + <xs:complexType>
>> + <xs:attribute name="path" use="optional" />
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheManagerEventListenerFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheManagerPeerProviderFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheManagerPeerListenerFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <!-- add clone support for addition of cacheExceptionHandler.
>> Important! -->
>> + <xs:element name="defaultCache">
>> + <xs:complexType>
>> + <xs:sequence>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheEventListenerFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheExtensionFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheLoaderFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> ref="bootstrapCacheLoaderFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> ref="cacheExceptionHandlerFactory"/>
>> + </xs:sequence>
>> + <xs:attribute name="diskExpiryThreadIntervalSeconds"
>> use="optional" type="xs:integer"/>
>> + <xs:attribute name="diskSpoolBufferSizeMB" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="diskPersistent" use="optional"
>> type="xs:boolean"/>
>> + <xs:attribute name="eternal" use="required"
>> type="xs:boolean"/>
>> + <xs:attribute name="maxElementsInMemory" use="required"
>> type="xs:integer"/>
>> + <xs:attribute name="memoryStoreEvictionPolicy"
>> use="optional" type="xs:string"/>
>> + <xs:attribute name="overflowToDisk" use="required"
>> type="xs:boolean"/>
>> + <xs:attribute name="timeToIdleSeconds" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="timeToLiveSeconds" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="maxElementsOnDisk" use="optional"
>> type="xs:integer"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cache">
>> + <xs:complexType>
>> + <xs:sequence >
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheEventListenerFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheExtensionFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="unbounded"
>> ref="cacheLoaderFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> ref="bootstrapCacheLoaderFactory"/>
>> + <xs:element minOccurs="0" maxOccurs="1"
>> ref="cacheExceptionHandlerFactory"/>
>> + </xs:sequence>
>> + <xs:attribute name="diskExpiryThreadIntervalSeconds"
>> use="optional" type="xs:integer"/>
>> + <xs:attribute name="diskSpoolBufferSizeMB" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="diskPersistent" use="optional"
>> type="xs:boolean"/>
>> + <xs:attribute name="eternal" use="required"
>> type="xs:boolean"/>
>> + <xs:attribute name="maxElementsInMemory" use="required"
>> type="xs:integer"/>
>> + <xs:attribute name="memoryStoreEvictionPolicy"
>> use="optional" type="xs:string"/>
>> + <xs:attribute name="name" use="required" type="xs:string"/>
>> + <xs:attribute name="overflowToDisk" use="required"
>> type="xs:boolean"/>
>> + <xs:attribute name="timeToIdleSeconds" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="timeToLiveSeconds" use="optional"
>> type="xs:integer"/>
>> + <xs:attribute name="maxElementsOnDisk" use="optional"
>> type="xs:integer"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheEventListenerFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="bootstrapCacheLoaderFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheExtensionFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheExceptionHandlerFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> + <xs:element name="cacheLoaderFactory">
>> + <xs:complexType>
>> + <xs:attribute name="class" use="required"/>
>> + <xs:attribute name="properties" use="optional"/>
>> + <xs:attribute name="propertySeparator" use="optional"/>
>> + </xs:complexType>
>> + </xs:element>
>> +</xs:schema>
>>
>> _______________________________________________
>> infinispan-commits mailing list
>> infinispan-commits at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-commits
>
> --
> Manik Surtani
> manik at jboss.org
> Lead, Infinispan
> Lead, JBoss Cache
> http://www.infinispan.org
> http://www.jbosscache.org
>
>
>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
--
Galder Zamarreño
Sr. Software Maintenance Engineer
JBoss, a division of Red Hat
More information about the infinispan-dev
mailing list