Congrats on your first contribution, Christophe! The first of many,
I
hope.
Begin forwarded message:
> From: infinispan-commits(a)lists.jboss.org
> Date: 9 June 2009 22:29:03 BST
> To: infinispan-commits(a)lists.jboss.org
> Subject: [infinispan-commits] Infinispan SVN: r420 - in
> trunk/core/src: main/resources/xslt and 2 other directories.
> Reply-To: infinispan-commits(a)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(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/infinispan-commits
--
Manik Surtani
manik(a)jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org
------------------------------------------------------------------------
_______________________________________________
infinispan-dev mailing list
infinispan-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev
--
Galder ZamarreƱo
Sr. Software Maintenance Engineer
JBoss, a division of Red Hat