Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
68ef19b6
Commit
68ef19b6
authored
Mar 09, 2017
by
Stephane Nicoll
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.5.x'
parents
019b0a3e
207ab3ec
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
190 additions
and
24 deletions
+190
-24
HazelcastJCacheCustomizationConfiguration.java
...gure/cache/HazelcastJCacheCustomizationConfiguration.java
+82
-0
JCacheCacheConfiguration.java
...rk/boot/autoconfigure/cache/JCacheCacheConfiguration.java
+16
-9
JCachePropertiesCustomizer.java
.../boot/autoconfigure/cache/JCachePropertiesCustomizer.java
+40
-0
CacheAutoConfigurationTests.java
...boot/autoconfigure/cache/CacheAutoConfigurationTests.java
+46
-15
hazelcast.xml
spring-boot-autoconfigure/src/test/resources/hazelcast.xml
+2
-0
spring-boot-features.adoc
spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
+4
-0
No files found.
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/HazelcastJCacheCustomizationConfiguration.java
0 → 100644
View file @
68ef19b6
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
cache
;
import
java.io.IOException
;
import
java.net.URI
;
import
java.util.Properties
;
import
com.hazelcast.core.HazelcastInstance
;
import
org.springframework.beans.factory.ObjectProvider
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.io.Resource
;
/**
* JCache customization for Hazelcast.
*
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnClass
(
HazelcastInstance
.
class
)
class
HazelcastJCacheCustomizationConfiguration
{
@Bean
public
HazelcastPropertiesCustomizer
hazelcastPropertiesCustomizer
(
ObjectProvider
<
HazelcastInstance
>
hazelcastInstance
)
{
return
new
HazelcastPropertiesCustomizer
(
hazelcastInstance
.
getIfUnique
());
}
private
static
class
HazelcastPropertiesCustomizer
implements
JCachePropertiesCustomizer
{
private
final
HazelcastInstance
hazelcastInstance
;
HazelcastPropertiesCustomizer
(
HazelcastInstance
hazelcastInstance
)
{
this
.
hazelcastInstance
=
hazelcastInstance
;
}
@Override
public
void
customize
(
CacheProperties
cacheProperties
,
Properties
properties
)
{
Resource
configLocation
=
cacheProperties
.
resolveConfigLocation
(
cacheProperties
.
getJcache
().
getConfig
());
if
(
configLocation
!=
null
)
{
// Hazelcast does not use the URI as a mean to specify a custom config.
properties
.
setProperty
(
"hazelcast.config.location"
,
toUri
(
configLocation
).
toString
());
}
else
if
(
this
.
hazelcastInstance
!=
null
)
{
properties
.
put
(
"hazelcast.instance.itself"
,
this
.
hazelcastInstance
);
}
}
private
static
URI
toUri
(
Resource
config
)
{
try
{
return
config
.
getURI
();
}
catch
(
IOException
ex
)
{
throw
new
IllegalArgumentException
(
"Could not get URI from "
+
config
,
ex
);
}
}
}
}
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java
View file @
68ef19b6
...
@@ -40,6 +40,7 @@ import org.springframework.context.annotation.Bean;
...
@@ -40,6 +40,7 @@ import org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.ConditionContext
;
import
org.springframework.context.annotation.ConditionContext
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.annotation.AnnotationAwareOrderComparator
;
import
org.springframework.core.annotation.AnnotationAwareOrderComparator
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.core.annotation.Order
;
...
@@ -59,6 +60,7 @@ import org.springframework.util.StringUtils;
...
@@ -59,6 +60,7 @@ import org.springframework.util.StringUtils;
@ConditionalOnMissingBean
(
org
.
springframework
.
cache
.
CacheManager
.
class
)
@ConditionalOnMissingBean
(
org
.
springframework
.
cache
.
CacheManager
.
class
)
@Conditional
({
CacheCondition
.
class
,
@Conditional
({
CacheCondition
.
class
,
JCacheCacheConfiguration
.
JCacheAvailableCondition
.
class
})
JCacheCacheConfiguration
.
JCacheAvailableCondition
.
class
})
@Import
(
HazelcastJCacheCustomizationConfiguration
.
class
)
class
JCacheCacheConfiguration
{
class
JCacheCacheConfiguration
{
private
final
CacheProperties
cacheProperties
;
private
final
CacheProperties
cacheProperties
;
...
@@ -69,14 +71,18 @@ class JCacheCacheConfiguration {
...
@@ -69,14 +71,18 @@ class JCacheCacheConfiguration {
private
final
List
<
JCacheManagerCustomizer
>
cacheManagerCustomizers
;
private
final
List
<
JCacheManagerCustomizer
>
cacheManagerCustomizers
;
private
final
List
<
JCachePropertiesCustomizer
>
cachePropertiesCustomizers
;
JCacheCacheConfiguration
(
CacheProperties
cacheProperties
,
JCacheCacheConfiguration
(
CacheProperties
cacheProperties
,
CacheManagerCustomizers
customizers
,
CacheManagerCustomizers
customizers
,
ObjectProvider
<
javax
.
cache
.
configuration
.
Configuration
<?,
?>>
defaultCacheConfiguration
,
ObjectProvider
<
javax
.
cache
.
configuration
.
Configuration
<?,
?>>
defaultCacheConfiguration
,
ObjectProvider
<
List
<
JCacheManagerCustomizer
>>
cacheManagerCustomizers
)
{
ObjectProvider
<
List
<
JCacheManagerCustomizer
>>
cacheManagerCustomizers
,
ObjectProvider
<
List
<
JCachePropertiesCustomizer
>>
cachePropertiesCustomizers
)
{
this
.
cacheProperties
=
cacheProperties
;
this
.
cacheProperties
=
cacheProperties
;
this
.
customizers
=
customizers
;
this
.
customizers
=
customizers
;
this
.
defaultCacheConfiguration
=
defaultCacheConfiguration
.
getIfAvailable
();
this
.
defaultCacheConfiguration
=
defaultCacheConfiguration
.
getIfAvailable
();
this
.
cacheManagerCustomizers
=
cacheManagerCustomizers
.
getIfAvailable
();
this
.
cacheManagerCustomizers
=
cacheManagerCustomizers
.
getIfAvailable
();
this
.
cachePropertiesCustomizers
=
cachePropertiesCustomizers
.
getIfAvailable
();
}
}
@Bean
@Bean
...
@@ -102,14 +108,14 @@ class JCacheCacheConfiguration {
...
@@ -102,14 +108,14 @@ class JCacheCacheConfiguration {
private
CacheManager
createCacheManager
()
throws
IOException
{
private
CacheManager
createCacheManager
()
throws
IOException
{
CachingProvider
cachingProvider
=
getCachingProvider
(
CachingProvider
cachingProvider
=
getCachingProvider
(
this
.
cacheProperties
.
getJcache
().
getProvider
());
this
.
cacheProperties
.
getJcache
().
getProvider
());
Properties
properties
=
createCacheManagerProperties
();
Resource
configLocation
=
this
.
cacheProperties
Resource
configLocation
=
this
.
cacheProperties
.
resolveConfigLocation
(
this
.
cacheProperties
.
getJcache
().
getConfig
());
.
resolveConfigLocation
(
this
.
cacheProperties
.
getJcache
().
getConfig
());
if
(
configLocation
!=
null
)
{
if
(
configLocation
!=
null
)
{
return
cachingProvider
.
getCacheManager
(
configLocation
.
getURI
(),
return
cachingProvider
.
getCacheManager
(
configLocation
.
getURI
(),
cachingProvider
.
getDefaultClassLoader
(),
cachingProvider
.
getDefaultClassLoader
(),
properties
);
createCacheManagerProperties
(
configLocation
));
}
}
return
cachingProvider
.
getCacheManager
();
return
cachingProvider
.
getCacheManager
(
null
,
null
,
properties
);
}
}
private
CachingProvider
getCachingProvider
(
String
cachingProviderFqn
)
{
private
CachingProvider
getCachingProvider
(
String
cachingProviderFqn
)
{
...
@@ -119,12 +125,13 @@ class JCacheCacheConfiguration {
...
@@ -119,12 +125,13 @@ class JCacheCacheConfiguration {
return
Caching
.
getCachingProvider
();
return
Caching
.
getCachingProvider
();
}
}
private
Properties
createCacheManagerProperties
(
Resource
configLocation
)
private
Properties
createCacheManagerProperties
()
{
throws
IOException
{
Properties
properties
=
new
Properties
();
Properties
properties
=
new
Properties
();
// Hazelcast does not use the URI as a mean to specify a custom config.
if
(
this
.
cachePropertiesCustomizers
!=
null
)
{
properties
.
setProperty
(
"hazelcast.config.location"
,
for
(
JCachePropertiesCustomizer
customizer
:
this
.
cachePropertiesCustomizers
)
{
configLocation
.
getURI
().
toString
());
customizer
.
customize
(
this
.
cacheProperties
,
properties
);
}
}
return
properties
;
return
properties
;
}
}
...
...
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCachePropertiesCustomizer.java
0 → 100644
View file @
68ef19b6
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
cache
;
import
java.util.Properties
;
import
javax.cache.CacheManager
;
import
javax.cache.spi.CachingProvider
;
/**
* Callback interface that can be implemented by beans wishing to customize the properties
* used by the {@link CachingProvider} to create the {@link CacheManager}.
*
* @author Stephane Nicoll
*/
interface
JCachePropertiesCustomizer
{
/**
* Customize the properties.
* @param cacheProperties the cache properties
* @param properties the current properties
* @see CachingProvider#getCacheManager(java.net.URI, ClassLoader, Properties)
*/
void
customize
(
CacheProperties
cacheProperties
,
Properties
properties
);
}
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java
View file @
68ef19b6
...
@@ -37,6 +37,7 @@ import com.couchbase.client.spring.cache.CouchbaseCacheManager;
...
@@ -37,6 +37,7 @@ import com.couchbase.client.spring.cache.CouchbaseCacheManager;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
com.github.benmanes.caffeine.cache.CaffeineSpec
;
import
com.hazelcast.cache.HazelcastCachingProvider
;
import
com.hazelcast.cache.HazelcastCachingProvider
;
import
com.hazelcast.core.Hazelcast
;
import
com.hazelcast.core.HazelcastInstance
;
import
com.hazelcast.core.HazelcastInstance
;
import
com.hazelcast.spring.cache.HazelcastCacheManager
;
import
com.hazelcast.spring.cache.HazelcastCacheManager
;
import
net.sf.ehcache.Status
;
import
net.sf.ehcache.Status
;
...
@@ -429,7 +430,7 @@ public class CacheAutoConfigurationTests {
...
@@ -429,7 +430,7 @@ public class CacheAutoConfigurationTests {
}
}
@Test
@Test
public
void
hazelcastCacheExplicit
()
{
public
void
hazelcastCacheExplicit
()
{
// Fail
load
(
new
Class
[]
{
HazelcastAutoConfiguration
.
class
,
load
(
new
Class
[]
{
HazelcastAutoConfiguration
.
class
,
DefaultCacheConfiguration
.
class
},
"spring.cache.type=hazelcast"
);
DefaultCacheConfiguration
.
class
},
"spring.cache.type=hazelcast"
);
HazelcastCacheManager
cacheManager
=
validateCacheManager
(
HazelcastCacheManager
cacheManager
=
validateCacheManager
(
...
@@ -483,6 +484,7 @@ public class CacheAutoConfigurationTests {
...
@@ -483,6 +484,7 @@ public class CacheAutoConfigurationTests {
JCacheCacheManager
cacheManager
=
validateCacheManager
(
JCacheCacheManager
cacheManager
=
validateCacheManager
(
JCacheCacheManager
.
class
);
JCacheCacheManager
.
class
);
assertThat
(
cacheManager
.
getCacheNames
()).
containsOnly
(
"foo"
,
"bar"
);
assertThat
(
cacheManager
.
getCacheNames
()).
containsOnly
(
"foo"
,
"bar"
);
assertThat
(
Hazelcast
.
getAllHazelcastInstances
()).
hasSize
(
1
);
}
}
finally
{
finally
{
Caching
.
getCachingProvider
(
cachingProviderFqn
).
close
();
Caching
.
getCachingProvider
(
cachingProviderFqn
).
close
();
...
@@ -492,6 +494,7 @@ public class CacheAutoConfigurationTests {
...
@@ -492,6 +494,7 @@ public class CacheAutoConfigurationTests {
@Test
@Test
public
void
hazelcastAsJCacheWithConfig
()
throws
IOException
{
public
void
hazelcastAsJCacheWithConfig
()
throws
IOException
{
String
cachingProviderFqn
=
HazelcastCachingProvider
.
class
.
getName
();
String
cachingProviderFqn
=
HazelcastCachingProvider
.
class
.
getName
();
try
{
String
configLocation
=
"org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml"
;
String
configLocation
=
"org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml"
;
load
(
DefaultCacheConfiguration
.
class
,
"spring.cache.type=jcache"
,
load
(
DefaultCacheConfiguration
.
class
,
"spring.cache.type=jcache"
,
"spring.cache.jcache.provider="
+
cachingProviderFqn
,
"spring.cache.jcache.provider="
+
cachingProviderFqn
,
...
@@ -501,6 +504,29 @@ public class CacheAutoConfigurationTests {
...
@@ -501,6 +504,29 @@ public class CacheAutoConfigurationTests {
Resource
configResource
=
new
ClassPathResource
(
configLocation
);
Resource
configResource
=
new
ClassPathResource
(
configLocation
);
assertThat
(
cacheManager
.
getCacheManager
().
getURI
())
assertThat
(
cacheManager
.
getCacheManager
().
getURI
())
.
isEqualTo
(
configResource
.
getURI
());
.
isEqualTo
(
configResource
.
getURI
());
assertThat
(
Hazelcast
.
getAllHazelcastInstances
()).
hasSize
(
1
);
}
finally
{
Caching
.
getCachingProvider
(
cachingProviderFqn
).
close
();
}
}
@Test
public
void
hazelcastAsJCacheWithExistingHazelcastInstance
()
throws
IOException
{
String
cachingProviderFqn
=
HazelcastCachingProvider
.
class
.
getName
();
load
(
new
Class
[]
{
HazelcastAutoConfiguration
.
class
,
DefaultCacheConfiguration
.
class
},
"spring.cache.type=jcache"
,
"spring.cache.jcache.provider="
+
cachingProviderFqn
);
JCacheCacheManager
cacheManager
=
validateCacheManager
(
JCacheCacheManager
.
class
);
javax
.
cache
.
CacheManager
jCacheManager
=
cacheManager
.
getCacheManager
();
assertThat
(
jCacheManager
).
isInstanceOf
(
com
.
hazelcast
.
cache
.
HazelcastCacheManager
.
class
);
assertThat
(
this
.
context
.
getBeansOfType
(
HazelcastInstance
.
class
)).
hasSize
(
1
);
HazelcastInstance
hazelcastInstance
=
this
.
context
.
getBean
(
HazelcastInstance
.
class
);
assertThat
(((
com
.
hazelcast
.
cache
.
HazelcastCacheManager
)
jCacheManager
)
.
getHazelcastInstance
()).
isSameAs
(
hazelcastInstance
);
assertThat
(
hazelcastInstance
.
getName
()).
isEqualTo
(
"default-instance"
);
assertThat
(
Hazelcast
.
getAllHazelcastInstances
()).
hasSize
(
1
);
}
}
@Test
@Test
...
@@ -566,6 +592,7 @@ public class CacheAutoConfigurationTests {
...
@@ -566,6 +592,7 @@ public class CacheAutoConfigurationTests {
@Test
@Test
public
void
jCacheCacheWithCachesAndCustomizer
()
{
public
void
jCacheCacheWithCachesAndCustomizer
()
{
String
cachingProviderFqn
=
HazelcastCachingProvider
.
class
.
getName
();
String
cachingProviderFqn
=
HazelcastCachingProvider
.
class
.
getName
();
try
{
load
(
JCacheWithCustomizerConfiguration
.
class
,
"spring.cache.type=jcache"
,
load
(
JCacheWithCustomizerConfiguration
.
class
,
"spring.cache.type=jcache"
,
"spring.cache.jcache.provider="
+
cachingProviderFqn
,
"spring.cache.jcache.provider="
+
cachingProviderFqn
,
"spring.cache.cacheNames[0]=foo"
,
"spring.cache.cacheNames[1]=bar"
);
"spring.cache.cacheNames[0]=foo"
,
"spring.cache.cacheNames[1]=bar"
);
...
@@ -573,6 +600,10 @@ public class CacheAutoConfigurationTests {
...
@@ -573,6 +600,10 @@ public class CacheAutoConfigurationTests {
// see customizer
// see customizer
assertThat
(
cacheManager
.
getCacheNames
()).
containsOnly
(
"foo"
,
"custom1"
);
assertThat
(
cacheManager
.
getCacheNames
()).
containsOnly
(
"foo"
,
"custom1"
);
}
}
finally
{
Caching
.
getCachingProvider
(
cachingProviderFqn
).
close
();
}
}
@Test
@Test
public
void
caffeineCacheWithExplicitCaches
()
{
public
void
caffeineCacheWithExplicitCaches
()
{
...
...
spring-boot-autoconfigure/src/test/resources/hazelcast.xml
View file @
68ef19b6
...
@@ -3,6 +3,8 @@
...
@@ -3,6 +3,8 @@
xmlns=
"http://www.hazelcast.com/schema/config"
xmlns=
"http://www.hazelcast.com/schema/config"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
>
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
>
<instance-name>
default-instance
</instance-name>
<map
name=
"defaultCache"
/>
<map
name=
"defaultCache"
/>
<network>
<network>
...
...
spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
View file @
68ef19b6
...
@@ -4117,6 +4117,10 @@ NOTE: Since a cache library may offer both a native implementation and JSR-107 s
...
@@ -4117,6 +4117,10 @@ NOTE: Since a cache library may offer both a native implementation and JSR-107 s
Spring Boot will prefer the JSR-107 support so that the same features are available if
Spring Boot will prefer the JSR-107 support so that the same features are available if
you switch to a different JSR-107 implementation.
you switch to a different JSR-107 implementation.
TIP: Spring Boot has a <<boot-features-hazelcast,general support for Hazelcast>>t. If
a single `HazelcastInstance` is available, it is automatically reused for the
`CacheManager` as well unless the `spring.cache.jcache.config` property is specified.
There are several ways to customize the underlying `javax.cache.cacheManager`:
There are several ways to customize the underlying `javax.cache.cacheManager`:
* Caches can be created on startup via the `spring.cache.cache-names` property. If a
* Caches can be created on startup via the `spring.cache.cache-names` property. If a
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment