Infinispanの設定ファイルのdefaultタグですが、どうもちゃんと理解しないまま使っていたようです…。まあ、なんとなくそんな素振りは見えていた気がしますが。
設定ファイルに書く
<default> <!-- 各種設定 --> </default>
の部分は、他のCacheのデフォルトの設定となり、namedCacheタグやConfigurationのAPIで再定義することで、オーバーライドすることができます。
Configuring Cache declaratively
https://docs.jboss.org/author/display/ISPN/Configuring+Cache+declaratively
Every time you define
https://docs.jboss.org/author/display/ISPN/Configuring+Cache+declarativelyelement in XML configuration file, in addition to cache element, you are effectively configuring additional caches whose settings are inheriting and/or overriding the default cache.
defaultの内容を継承するって書いてますねー。
ConfigurationのAPIで組み立てる場合は、defaultは設定ファイルで決めなくてはならない感じがしますけど。
Configuring cache programmatically
https://docs.jboss.org/author/display/ISPN/Configuring+cache+programmatically
で、気付いてしまったからには、ちょっと確認してみましょう。
確認のために、こんなトレイトを用意しました。
import org.infinispan.Cache import org.infinispan.configuration.cache._ import org.infinispan.configuration.global.GlobalConfigurationBuilder import org.infinispan.manager.{DefaultCacheManager, EmbeddedCacheManager} import org.infinispan.transaction.{LockingMode, TransactionMode} import org.infinispan.transaction.lookup.GenericTransactionManagerLookup trait InfinispanCacheConfigurationPrintSupport { protected def createCacheManager: EmbeddedCacheManager def run(): Unit = { val manager = createCacheManager val defaultCache = manager.getCache[Any, Any]() val simpleNamedCache = manager.getCache[Any, Any]("simpleNamedCache") val namedCacheOverride = manager.getCache[Any, Any]("namedCacheOverride") try { for (cache <- List( defaultCache, simpleNamedCache, namedCacheOverride)) { println(s"========================= CacheName[${cache.getName}] =========================") print(cache.getCacheConfiguration.toString.replaceAll("(\\{|\\})", "$1\n")) println(s"========================= CacheName[${cache.getName}] =========================") } println(System.lineSeparator * 3) val cacheConfigurationString = (cache: Cache[_, _]) => cache .getCacheConfiguration .toString .replaceAll("(\\{|\\})", "$1\n") .replaceAll("""@[0-9a-z]+""", "") val defaultCacheDefinition = cacheConfigurationString(defaultCache) for ((name, definition) <- List( (simpleNamedCache.getName, cacheConfigurationString(simpleNamedCache)), (namedCacheOverride.getName, cacheConfigurationString(namedCacheOverride)) )) { val (_, diff) = defaultCacheDefinition.zip(definition) .span { case (c1, c2) => c1 == c2 } println(s"******************** defaultCache diff $name, Start ********************") diff.foreach { case (_, c) => print(c) } println(s"******************** defaultCache diff $name, End ********************") } } finally { defaultCache.stop() simpleNamedCache.stop() namedCacheOverride.stop() manager.stop() } } }
利用するCacheは3つ、default、何も設定しないCache(simpleNamedCache)、追加の設定を行ったCache(namedCacheOverride)です。これらの設定内容を、Cache#getCacheConfiguration#toStringで文字列化し、簡易的に差分を見てみようというコードです。
最初に、それぞれの設定内容が出力され、その後にdefaultの定義内容と相違が検出された場合は、検出地点からの内容が出力されます。
この部分です。
println(s"******************** defaultCache diff $name, Start ********************") diff.foreach { case (_, c) => print(c) } println(s"******************** defaultCache diff $name, End ********************")
Configuring Cache declaratively
では、まずは設定ファイルで明示的に定義する方から。用意した設定ファイルは、こんな感じです。
<?xml version="1.0" encoding="UTF-8"?> <infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:5.3 http://www.infinispan.org/schemas/infinispan-config-5.3.xsd" xmlns="urn:infinispan:config:5.3"> <global> <transport clusterName="configuration-cluster"> <properties> <property name="configurationFile" value="jgroups.xml" /> </properties> </transport> <globalJmxStatistics enabled="true" jmxDomain="org.infinispan" cacheManagerName="DefaultCacheManager" /> </global> <default> <clustering mode="distribution" /> <transaction transactionManagerLookupClass="org.infinispan.transaction.lookup.GenericTransactionManagerLookup" transactionMode="TRANSACTIONAL" lockingMode="PESSIMISTIC" autoCommit="true" /> </default> <namedCache name="simpleNamedCache" /> <namedCache name="namedCacheOverride"> <storeAsBinary enabled="true" /> <invocationBatching enabled="true" /> <transaction lockingMode="OPTIMISTIC" autoCommit="false" /> </namedCache> </infinispan>
namedCacheOverrideは、storeAsBinary、バッチの有効化、トランザクションの属性を一部変更って感じにしてます。
で、先ほどのトレイトを単純にMix-inしたオブジェクトを定義して
object InfinispanDeclarativeConfiguration extends InfinispanCacheConfigurationPrintSupport { protected def createCacheManager: EmbeddedCacheManager = new DefaultCacheManager("infinispan.xml") def main(args: Array[String]): Unit = run() }
実行します。
> run-main InfinispanDeclarativeConfiguration [info] Running InfinispanDeclarativeConfiguration
最初の出力結果は、こんな感じ。
[info] ========================= CacheName[___defaultcache] ========================= [info] Configuration{ [info] classLoader=java.lang.ref.WeakReference@7f676908, clustering=ClusteringConfiguration{ [info] async=AsyncConfiguration{ [info] asyncMarshalling=false, replicationQueue=null, replicationQueueInterval=5000, replicationQueueMaxElements=1000, useReplicationQueue=false} [info] , cacheMode=DIST_SYNC, hash=HashConfiguration{ [info] consistentHashFactory=null, hash=MurmurHash3, numOwners=2, numSegments=60, groupsConfiguration=GroupsConfiguration{ [info] enabled=false, groupers=[]} [info] , stateTransferConfiguration=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] } [info] , l1=L1Configuration{ [info] enabled=false, invalidationThreshold=0, lifespan=600000, onRehash=false, cleanupTaskFrequency=600000} [info] , stateTransfer=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] , sync=SyncConfiguration{ [info] replTimeout=15000} [info] } [info] , customInterceptors=CustomInterceptorsConfiguration{ [info] interceptors=[]} [info] , dataContainer=DataContainerConfiguration{ [info] dataContainer=null, keyEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90, valueEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90} [info] , deadlockDetection=DeadlockDetectionConfiguration{ [info] enabled=false, spinDuration=100} [info] , eviction=EvictionConfiguration{ [info] maxEntries=-1, strategy=NONE, threadPolicy=DEFAULT} [info] , expiration=ExpirationConfiguration{ [info] lifespan=-1, maxIdle=-1, reaperEnabled=true, wakeUpInterval=60000} [info] , indexing=IndexingConfiguration{ [info] enabled=false, indexLocalOnly=false} [info] , invocationBatching=InvocationBatchingConfiguration{ [info] enabled=false} [info] , jmxStatistics=JMXStatisticsConfiguration{ [info] enabled=false} [info] , loaders=LoadersConfiguration{ [info] cacheLoaders=[], passivation=false, preload=false, shared=false} [info] , locking=LockingConfiguration{ [info] concurrencyLevel=32, isolationLevel=READ_COMMITTED, lockAcquisitionTimeout=10000, useLockStriping=false, writeSkewCheck=false} [info] , modules={ [info] } [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=false, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false} [info] , transaction=TransactionConfiguration{ [info] autoCommit=true, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=PESSIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup@3b97d937, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false} [info] , versioning=VersioningConfiguration{ [info] enabled=false, scheme=NONE} [info] , unsafe=UnsafeConfiguration{ [info] unreliableReturnValues=false} [info] , sites=SiteConfiguration{ [info] allBackups=[], backupFor=BackupForConfiguration{ [info] remoteCache='null', remoteSite='null'} [info] , disableBackups=false, inUseBackupSites=[]} [info] , compatibility=CompatibilityModeConfiguration{ [info] enabled=false, marshaller=null} [info] } [info] ========================= CacheName[___defaultcache] ========================= [info] ========================= CacheName[simpleNamedCache] ========================= [info] Configuration{ [info] classLoader=java.lang.ref.WeakReference@6e35c871, clustering=ClusteringConfiguration{ [info] async=AsyncConfiguration{ [info] asyncMarshalling=false, replicationQueue=null, replicationQueueInterval=5000, replicationQueueMaxElements=1000, useReplicationQueue=false} [info] , cacheMode=DIST_SYNC, hash=HashConfiguration{ [info] consistentHashFactory=null, hash=MurmurHash3, numOwners=2, numSegments=60, groupsConfiguration=GroupsConfiguration{ [info] enabled=false, groupers=[]} [info] , stateTransferConfiguration=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] } [info] , l1=L1Configuration{ [info] enabled=false, invalidationThreshold=0, lifespan=600000, onRehash=false, cleanupTaskFrequency=600000} [info] , stateTransfer=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] , sync=SyncConfiguration{ [info] replTimeout=15000} [info] } [info] , customInterceptors=CustomInterceptorsConfiguration{ [info] interceptors=[]} [info] , dataContainer=DataContainerConfiguration{ [info] dataContainer=null, keyEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90, valueEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90} [info] , deadlockDetection=DeadlockDetectionConfiguration{ [info] enabled=false, spinDuration=100} [info] , eviction=EvictionConfiguration{ [info] maxEntries=-1, strategy=NONE, threadPolicy=DEFAULT} [info] , expiration=ExpirationConfiguration{ [info] lifespan=-1, maxIdle=-1, reaperEnabled=true, wakeUpInterval=60000} [info] , indexing=IndexingConfiguration{ [info] enabled=false, indexLocalOnly=false} [info] , invocationBatching=InvocationBatchingConfiguration{ [info] enabled=false} [info] , jmxStatistics=JMXStatisticsConfiguration{ [info] enabled=false} [info] , loaders=LoadersConfiguration{ [info] cacheLoaders=[], passivation=false, preload=false, shared=false} [info] , locking=LockingConfiguration{ [info] concurrencyLevel=32, isolationLevel=READ_COMMITTED, lockAcquisitionTimeout=10000, useLockStriping=false, writeSkewCheck=false} [info] , modules={ [info] } [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=false, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false} [info] , transaction=TransactionConfiguration{ [info] autoCommit=true, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=PESSIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup@3b97d937, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false} [info] , versioning=VersioningConfiguration{ [info] enabled=false, scheme=NONE} [info] , unsafe=UnsafeConfiguration{ [info] unreliableReturnValues=false} [info] , sites=SiteConfiguration{ [info] allBackups=[], backupFor=BackupForConfiguration{ [info] remoteCache='null', remoteSite='null'} [info] , disableBackups=false, inUseBackupSites=[]} [info] , compatibility=CompatibilityModeConfiguration{ [info] enabled=false, marshaller=null} [info] } [info] ========================= CacheName[simpleNamedCache] ========================= [info] ========================= CacheName[namedCacheOverride] ========================= [info] Configuration{ [info] classLoader=java.lang.ref.WeakReference@cfaab3e, clustering=ClusteringConfiguration{ [info] async=AsyncConfiguration{ [info] asyncMarshalling=false, replicationQueue=null, replicationQueueInterval=5000, replicationQueueMaxElements=1000, useReplicationQueue=false} [info] , cacheMode=DIST_SYNC, hash=HashConfiguration{ [info] consistentHashFactory=null, hash=MurmurHash3, numOwners=2, numSegments=60, groupsConfiguration=GroupsConfiguration{ [info] enabled=false, groupers=[]} [info] , stateTransferConfiguration=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] } [info] , l1=L1Configuration{ [info] enabled=false, invalidationThreshold=0, lifespan=600000, onRehash=false, cleanupTaskFrequency=600000} [info] , stateTransfer=StateTransferConfiguration{ [info] chunkSize=10000, fetchInMemoryState=true, originalFetchInMemoryState=null, timeout=240000, awaitInitialTransfer=true, originalAwaitInitialTransfer=null} [info] , sync=SyncConfiguration{ [info] replTimeout=15000} [info] } [info] , customInterceptors=CustomInterceptorsConfiguration{ [info] interceptors=[]} [info] , dataContainer=DataContainerConfiguration{ [info] dataContainer=null, keyEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90, valueEquivalence=org.infinispan.commons.equivalence.AnyEquivalence@5e20cd90} [info] , deadlockDetection=DeadlockDetectionConfiguration{ [info] enabled=false, spinDuration=100} [info] , eviction=EvictionConfiguration{ [info] maxEntries=-1, strategy=NONE, threadPolicy=DEFAULT} [info] , expiration=ExpirationConfiguration{ [info] lifespan=-1, maxIdle=-1, reaperEnabled=true, wakeUpInterval=60000} [info] , indexing=IndexingConfiguration{ [info] enabled=false, indexLocalOnly=false} [info] , invocationBatching=InvocationBatchingConfiguration{ [info] enabled=true} [info] , jmxStatistics=JMXStatisticsConfiguration{ [info] enabled=false} [info] , loaders=LoadersConfiguration{ [info] cacheLoaders=[], passivation=false, preload=false, shared=false} [info] , locking=LockingConfiguration{ [info] concurrencyLevel=32, isolationLevel=READ_COMMITTED, lockAcquisitionTimeout=10000, useLockStriping=false, writeSkewCheck=false} [info] , modules={ [info] } [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=true, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false} [info] , transaction=TransactionConfiguration{ [info] autoCommit=false, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=OPTIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup@3b97d937, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false} [info] , versioning=VersioningConfiguration{ [info] enabled=false, scheme=NONE} [info] , unsafe=UnsafeConfiguration{ [info] unreliableReturnValues=false} [info] , sites=SiteConfiguration{ [info] allBackups=[], backupFor=BackupForConfiguration{ [info] remoteCache='null', remoteSite='null'} [info] , disableBackups=false, inUseBackupSites=[]} [info] , compatibility=CompatibilityModeConfiguration{ [info] enabled=false, marshaller=null} [info] } [info] ========================= CacheName[namedCacheOverride] =========================
違いが分かりにくい…。
差分の方は、こんな感じです。
[info] ******************** defaultCache diff simpleNamedCache, Start ******************** [info] ******************** defaultCache diff simpleNamedCache, End ******************** [info] ******************** defaultCache diff namedCacheOverride, Start ******************** [info] true} [info] , jmxStatistics=JMXStatisticsConfiguration{ [info] enabled=false} [info] , loaders=LoadersConfiguration{ [info] cacheLoaders=[], passivation=false, preload=false, shared=false} [info] , locking=LockingConfiguration{ [info] concurrencyLevel=32, isolationLevel=READ_COMMITTED, lockAcquisitionTimeout=10000, useLockStriping=false, writeSkewCheck=false} [info] , modules={ [info] } [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=true, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false} [info] , transaction=TransactionConfiguration{ [info] autoCommit=false, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=OPTIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false} [info] , versioning=VersioningConfiguration{ [info] enabled=false, scheme=NONE} [info] , unsafe=UnsafeConfiguration{ [info] unreliableReturnValues=false} [info] , sites=SiteConfiguration{ [info] allBackups=[], backupFor=BackupForConfiguration{ [info] remoteCache='null', remoteSite='null'} [info] , disableBackups=false, inUseBackupSites=[]} [info] , compatibility=CompatibilityModeConfiguration{ [info] enabled=false, marshaller=null} [info] }
simpleNamedCacheの方は、差分ゼロ。namedCacheOverrideの方は、invocationBatchingの部分から差が出ています。まあ、名前は切れちゃってますけど…。
よくよく見ると、storeAsBinaryや
## default [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=false, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false} ## namedCacheOverride [info] , storeAsBinary=StoreAsBinaryConfiguration{ [info] enabled=true, storeKeysAsBinary=true, storeValuesAsBinary=true, defensive=false}
トランザクションの設定内容に差がありますが、
## default [info] , transaction=TransactionConfiguration{ [info] autoCommit=true, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=PESSIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup@3b97d937, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false} ## namedCacheOverride [info] , transaction=TransactionConfiguration{ [info] autoCommit=false, cacheStopTimeout=30000, eagerLockingSingleNode=false, lockingMode=OPTIMISTIC, syncCommitPhase=true, syncRollbackPhase=false, transactionManagerLookup=org.infinispan.transaction.lookup.GenericTransactionManagerLookup@3b97d937, transactionSynchronizationRegistryLookup=null, transactionMode=TRANSACTIONAL, useEagerLocking=false, useSynchronization=true, recovery=RecoveryConfiguration{ [info] enabled=true, recoveryInfoCacheName='__recoveryInfoCacheName__'} [info] , reaperWakeUpInterval=1000, completedTxTimeout=15000, use1PcForAutoCommitTransactions=false}
namedCacheOverrideの方、TRANSACTIONALって書いてませんけど、TRANSACTIONALになってますね!!差分定義した属性だけがきっちり変わってますわ…。
Configuring cache programmatically
続いて、ConfigurationのAPIでJava側で組み立てる場合。こちらも、先のトレイトをMix-inしたオブジェクトを用意しました。
なお、このパターンは2つの方法で試しています。まずは、defaultのCacheの内容は、設定ファイルで定義する方法。
object InfinispanProgrammaticalConfiguration extends InfinispanCacheConfigurationPrintSupport { protected def createCacheManager: EmbeddedCacheManager = { val manager = new DefaultCacheManager("infinispan-default.xml") val defaultCacheConfiguration = manager.getDefaultCacheConfiguration manager.defineConfiguration("namedCacheOverride", new ConfigurationBuilder() .read(defaultCacheConfiguration) .storeAsBinary .enable .invocationBatching .enable .transaction .lockingMode(LockingMode.OPTIMISTIC) .autoCommit(false) .build) manager } def main(args: Array[String]): Unit = run() }
defaultのConfigurationを取得して、ConfigurationBuilder#readでコピーしているところがポイントです。
val defaultCacheConfiguration = manager.getDefaultCacheConfiguration manager.defineConfiguration("namedCacheOverride", new ConfigurationBuilder() .read(defaultCacheConfiguration)
defaultのCacheを定義した、XMLファイル。
<?xml version="1.0" encoding="UTF-8"?> <infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:5.3 http://www.infinispan.org/schemas/infinispan-config-5.3.xsd" xmlns="urn:infinispan:config:5.3"> <global> <transport clusterName="configuration-cluster"> <properties> <property name="configurationFile" value="jgroups.xml" /> </properties> </transport> <globalJmxStatistics enabled="true" jmxDomain="org.infinispan" cacheManagerName="DefaultCacheManager" /> </global> <default> <clustering mode="distribution" /> <transaction transactionManagerLookupClass="org.infinispan.transaction.lookup.GenericTransactionManagerLookup" transactionMode="TRANSACTIONAL" lockingMode="PESSIMISTIC" autoCommit="true" /> </default> </infinispan>
ここには、名前付きCacheの設定は書きません。
では、実行。
> run-main InfinispanProgrammaticalConfiguration [info] Running InfinispanProgrammaticalConfiguration
結果は、先の設定ファイルで書いた例と変わらないので、割愛します。
もう1パターンは、全部APIで書いてしまう方法。
object InfinispanProgrammaticalConfiguration extends InfinispanCacheConfigurationPrintSupport { protected def createCacheManager: EmbeddedCacheManager = { val globalConfiguration = new GlobalConfigurationBuilder() .transport .defaultTransport .clusterName("configuration-cluster") .addProperty("configurationFile", "jgroups.xml") .globalJmxStatistics .enable .jmxDomain("org.infinispan") .cacheManagerName("DefaultCacheManager") .build val defaultCacheConfiguration = new ConfigurationBuilder() .clustering .cacheMode(CacheMode.DIST_SYNC) .transaction .transactionManagerLookup(new GenericTransactionManagerLookup) .transactionMode(TransactionMode.TRANSACTIONAL) .lockingMode(LockingMode.PESSIMISTIC) .autoCommit(true) .build val manager = new DefaultCacheManager(globalConfiguration, defaultCacheConfiguration) manager.defineConfiguration("namedCacheOverride", new ConfigurationBuilder() .read(defaultCacheConfiguration) .storeAsBinary .enable .invocationBatching .enable .transaction .lockingMode(LockingMode.OPTIMISTIC) .autoCommit(false) .build) manager } def main(args: Array[String]): Unit = run() }
こちらも、結果は割愛です。
というわけで、defaultのCacheで定義した内容は
- 設定ファイルで名前付きCacheを設定した場合は、defaultの定義内容を引き継ぐ
- ConfigurationのAPIを使用した場合は、ConfigurationBuilder#readで引数に指定したConfigurationの内容をテンプレートとして使用する
と共に、個別に設定を上書きできることを確認しました。