From a41b83a2fd592936ddd5d0417a30c8baec1dd8fc Mon Sep 17 00:00:00 2001 From: Stephane Nicoll <snicoll@pivotal.io> Date: Mon, 29 Aug 2016 18:48:12 +0200 Subject: [PATCH] Upgrade to Ehcache 3 I saw on twitter the reference of an article (in french): http://javaetmoi.com/2016/08/migrer-vers-spring-boot/ That article concludes with something along the lines of "Besides the EhCache and Maven configuration, Petclinic does not hold a single line of XML anymore". Looking at the code, we can remove more XML if you want. This PR migrates the cache infrastructure to EhCache 3 and JCache (JSR-107). This also reduces the number of dependencies. --- pom.xml | 28 +- .../samples/petclinic/config/CacheConfig.java | 30 ++ src/main/resources/ehcache.xml | 17 - src/main/resources/ehcache.xsd | 419 ------------------ 4 files changed, 35 insertions(+), 459 deletions(-) delete mode 100644 src/main/resources/ehcache.xml delete mode 100644 src/main/resources/ehcache.xsd diff --git a/pom.xml b/pom.xml index 06741b4..fb363d3 100644 --- a/pom.xml +++ b/pom.xml @@ -59,10 +59,6 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> - </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> @@ -74,18 +70,6 @@ <artifactId>jstl</artifactId> </dependency> - - <!-- used for EhCacheCacheManager --> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - </dependency> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjweaver</artifactId> - <scope>runtime</scope> - </dependency> - <!-- Date and Time --> <dependency> <groupId>joda-time</groupId> @@ -123,14 +107,12 @@ <!-- EhCache --> <dependency> - <groupId>net.sf.ehcache</groupId> + <groupId>javax.cache</groupId> + <artifactId>cache-api</artifactId> + </dependency> + <dependency> + <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> - <exclusions> - <exclusion> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - </exclusion> - </exclusions> </dependency> <!-- Dandelion --> diff --git a/src/main/java/org/springframework/samples/petclinic/config/CacheConfig.java b/src/main/java/org/springframework/samples/petclinic/config/CacheConfig.java index fc4a0bc..4e1a6a0 100644 --- a/src/main/java/org/springframework/samples/petclinic/config/CacheConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/config/CacheConfig.java @@ -1,6 +1,19 @@ package org.springframework.samples.petclinic.config; +import java.util.concurrent.TimeUnit; +import javax.cache.CacheManager; + +import org.ehcache.config.CacheConfiguration; +import org.ehcache.config.builders.CacheConfigurationBuilder; +import org.ehcache.config.builders.ResourcePoolsBuilder; +import org.ehcache.config.units.EntryUnit; +import org.ehcache.expiry.Duration; +import org.ehcache.expiry.Expirations; +import org.ehcache.jsr107.Eh107Configuration; + +import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -11,4 +24,21 @@ import org.springframework.context.annotation.Profile; @EnableCaching @Profile("production") public class CacheConfig { + + @Bean + public JCacheManagerCustomizer cacheManagerCustomizer() { + return new JCacheManagerCustomizer() { + @Override + public void customize(CacheManager cacheManager) { + CacheConfiguration<Object, Object> config = CacheConfigurationBuilder + .newCacheConfigurationBuilder(Object.class, Object.class, + ResourcePoolsBuilder.newResourcePoolsBuilder() + .heap(100, EntryUnit.ENTRIES)) + .withExpiry(Expirations.timeToLiveExpiration(Duration.of(60, TimeUnit.SECONDS))) + .build(); + cacheManager.createCache("vets", Eh107Configuration.fromEhcacheCacheConfiguration(config)); + } + }; + } + } diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml deleted file mode 100644 index 32e5099..0000000 --- a/src/main/resources/ehcache.xml +++ /dev/null @@ -1,17 +0,0 @@ -<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="ehcache.xsd" - updateCheck="false"> - <diskStore path="java.io.tmpdir"/> - - <!-- objects are evicted from the cache every 60 seconds --> - <cache name="vets" - timeToLiveSeconds="60" - maxElementsInMemory="100" - eternal="false" - overflowToDisk="false" - maxElementsOnDisk="10000000" - diskPersistent="false" - diskExpiryThreadIntervalSeconds="1" - memoryStoreEvictionPolicy="LRU"/> - -</ehcache> diff --git a/src/main/resources/ehcache.xsd b/src/main/resources/ehcache.xsd deleted file mode 100644 index bfc19dd..0000000 --- a/src/main/resources/ehcache.xsd +++ /dev/null @@ -1,419 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.7"> - - <xs:element name="ehcache"> - <xs:complexType> - <xs:sequence> - <xs:element maxOccurs="1" minOccurs="0" ref="managementRESTService"/> - <xs:element maxOccurs="1" minOccurs="0" ref="diskStore"/> - <xs:element maxOccurs="1" minOccurs="0" ref="sizeOfPolicy"/> - <xs:element maxOccurs="1" minOccurs="0" ref="transactionManagerLookup"/> - <xs:element maxOccurs="1" minOccurs="0" ref="cacheManagerEventListenerFactory"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerProviderFactory"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerListenerFactory"/> - <xs:element maxOccurs="1" minOccurs="0" ref="terracottaConfig"/> - <xs:element maxOccurs="1" minOccurs="0" ref="defaultCache"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cache"/> - </xs:sequence> - <xs:attribute name="name" use="optional"/> - <xs:attribute default="true" name="updateCheck" type="xs:boolean" use="optional"/> - <xs:attribute default="autodetect" name="monitoring" type="monitoringType" use="optional"/> - <xs:attribute default="true" name="dynamicConfig" type="xs:boolean" use="optional"/> - <xs:attribute default="15" name="defaultTransactionTimeoutInSeconds" type="xs:integer" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnit" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnit" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="managementRESTService"> - <xs:complexType> - <xs:attribute name="enabled" type="xs:boolean" use="optional"/> - <xs:attribute name="bind" use="optional"/> - <xs:attribute name="securityServiceLocation" use="optional"/> - <xs:attribute name="securityServiceTimeout" use="optional" type="xs:integer"/> - <xs:attribute name="sslEnabled" use="optional" type="xs:boolean"/> - <xs:attribute name="needClientAuth" use="optional" type="xs:boolean"/> - <xs:attribute name="sampleHistorySize" use="optional" type="xs:integer"/> - <xs:attribute name="sampleIntervalSeconds" use="optional" type="xs:integer"/> - <xs:attribute name="sampleSearchIntervalSeconds" use="optional" type="xs:integer"/> - </xs:complexType> - </xs:element> - <xs:element name="diskStore"> - <xs:complexType> - <xs:attribute name="path" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="transactionManagerLookup"> - <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="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> - <xs:element name="terracottaConfig"> - <xs:complexType> - <xs:sequence> - <xs:element maxOccurs="1" minOccurs="0" name="tc-config"> - <xs:complexType> - <xs:sequence> - <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute default="localhost:9510" name="url" use="optional"/> - <xs:attribute name="rejoin" type="xs:boolean" use="optional" default="false"/> - </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="unbounded" ref="cacheDecoratorFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/> - <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/> - <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/> - <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/> - </xs:sequence> - <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/> - <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/> - <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/> - <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxElementsInMemory" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalHeap" type="xs:integer" use="optional"/> - <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/> - <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/> - <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/> - <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalDisk" type="xs:integer" use="optional"/> - <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/> - <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/> - <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/> - </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="unbounded" ref="cacheDecoratorFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/> - <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/> - <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="searchable"/> - <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/> - <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/> - </xs:sequence> - <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/> - <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/> - <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/> - <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxElementsInMemory" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalHeap" type="xs:integer" use="optional"/> - <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/> - <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/> - <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalDisk" type="xs:integer" use="optional"/> - <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/> - <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="logging" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/> - <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnitOrPercentage" use="optional"/> - </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:attribute name="listenFor" use="optional" type="notificationScope" default="all"/> - </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:element name="cacheDecoratorFactory"> - <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="searchAttribute"> - <xs:complexType> - <xs:attribute name="name" use="required" type="xs:string"/> - <xs:attribute name="expression" type="xs:string"/> - <xs:attribute name="class" type="xs:string"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - - <xs:element name="searchable"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="searchAttribute"/> - </xs:sequence> - <xs:attribute name="keys" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="values" use="optional" type="xs:boolean" default="true"/> - </xs:complexType> - </xs:element> - - <xs:element name="pinning"> - <xs:complexType> - <xs:attribute name="store" use="required" type="pinningStoreType"/> - </xs:complexType> - </xs:element> - - <xs:element name="terracotta"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="nonstop"/> - </xs:sequence> - <xs:attribute name="clustered" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="valueMode" use="optional" type="terracottaCacheValueType" default="serialization"/> - <xs:attribute name="coherentReads" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="localKeyCache" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="localKeyCacheSize" use="optional" type="xs:positiveInteger" default="300000"/> - <xs:attribute name="orphanEviction" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="orphanEvictionPeriod" use="optional" type="xs:positiveInteger" default="4"/> - <xs:attribute name="copyOnRead" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="coherent" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="consistency" use="optional" type="consistencyType" default="eventual"/> - <xs:attribute name="synchronousWrites" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="concurrency" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="localCacheEnabled" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="compressionEnabled" use="optional" type="xs:boolean" default="false"/> - </xs:complexType> - </xs:element> - <xs:simpleType name="consistencyType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="strong"/> - <xs:enumeration value="eventual"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="nonstop"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="timeoutBehavior"/> - </xs:sequence> - <xs:attribute name="enabled" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="immediateTimeout" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="timeoutMillis" use="optional" type="xs:positiveInteger" default="30000"/> - </xs:complexType> - </xs:element> - <xs:element name="timeoutBehavior"> - <xs:complexType> - <xs:attribute name="type" use="optional" type="timeoutBehaviorType" default="exception"/> - <xs:attribute name="properties" use="optional" default=""/> - <xs:attribute name="propertySeparator" use="optional" default=","/> - </xs:complexType> - </xs:element> - <xs:simpleType name="timeoutBehaviorType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="noop"/> - <xs:enumeration value="exception"/> - <xs:enumeration value="localReads"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="monitoringType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="autodetect"/> - <xs:enumeration value="on"/> - <xs:enumeration value="off"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="pinningStoreType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="localHeap"/> - <xs:enumeration value="localMemory"/> - <xs:enumeration value="inCache"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="terracottaCacheValueType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="serialization"/> - <xs:enumeration value="identity"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="transactionalMode"> - <xs:restriction base="xs:string"> - <xs:enumeration value="off"/> - <xs:enumeration value="xa_strict"/> - <xs:enumeration value="xa"/> - <xs:enumeration value="local"/> - </xs:restriction> - </xs:simpleType> - - <xs:element name="cacheWriter"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriterFactory"/> - </xs:sequence> - <xs:attribute name="writeMode" use="optional" type="writeModeType" default="write-through"/> - <xs:attribute name="notifyListenersOnException" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="minWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="maxWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="rateLimitPerSecond" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="writeCoalescing" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="writeBatching" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="writeBatchSize" use="optional" type="xs:positiveInteger" default="1"/> - <xs:attribute name="retryAttempts" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="retryAttemptDelaySeconds" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="writeBehindConcurrency" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="writeBehindMaxQueueSize" use="optional" type="xs:nonNegativeInteger" default="0"/> - </xs:complexType> - </xs:element> - <xs:simpleType name="writeModeType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="write-through"/> - <xs:enumeration value="write-behind"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="cacheWriterFactory"> - <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="copyStrategy"> - <xs:complexType> - <xs:attribute name="class" use="required" type="xs:string"/> - </xs:complexType> - </xs:element> - - <xs:element name="elementValueComparator"> - <xs:complexType> - <xs:attribute name="class" use="required" type="xs:string"/> - </xs:complexType> - </xs:element> - - <xs:element name="sizeOfPolicy"> - <xs:complexType> - <xs:attribute name="maxDepth" use="required" type="xs:integer"/> - <xs:attribute name="maxDepthExceededBehavior" use="optional" default="continue" - type="maxDepthExceededBehavior"/> - </xs:complexType> - </xs:element> - - <xs:element name="persistence"> - <xs:complexType> - <xs:attribute name="strategy" use="required" type="persistenceStrategy"/> - <xs:attribute name="synchronousWrites" use="optional" default="false" type="xs:boolean"/> - </xs:complexType> - </xs:element> - - <xs:simpleType name="persistenceStrategy"> - <xs:restriction base="xs:string"> - <xs:enumeration value="localTempSwap"/> - <xs:enumeration value="localRestartable"/> - <xs:enumeration value="none"/> - <xs:enumeration value="distributed"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="maxDepthExceededBehavior"> - <xs:restriction base="xs:string"> - <xs:enumeration value="continue"/> - <xs:enumeration value="abort"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="notificationScope"> - <xs:restriction base="xs:string"> - <xs:enumeration value="local"/> - <xs:enumeration value="remote"/> - <xs:enumeration value="all"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="memoryUnit"> - <xs:restriction base="xs:token"> - <xs:pattern value="[0-9]+[bBkKmMgG]?"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="memoryUnitOrPercentage"> - <xs:restriction base="xs:token"> - <xs:pattern value="([0-9]+[bBkKmMgG]?|100%|[0-9]{1,2}%)"/> - </xs:restriction> - </xs:simpleType> -</xs:schema> \ No newline at end of file -- GitLab