diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/hazelcast.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/hazelcast.xml index cfb3b2e15b..23f6e90e93 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/hazelcast.xml +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/hazelcast.xml @@ -1,5 +1,5 @@ diff --git a/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast.xml b/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast.xml index 56298f8e79..ee10fee2ca 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast.xml +++ b/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast.xml @@ -1,7 +1,7 @@ + http://www.hazelcast.com/schema/config/hazelcast-config-5.0.xsd"> actuator-hazelcast diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/hazelcast.xml b/spring-boot-project/spring-boot-autoconfigure/src/test/resources/hazelcast.xml index 4e6920f317..edf5d0a1f8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/hazelcast.xml +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/resources/hazelcast.xml @@ -1,5 +1,5 @@ default-instance diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml b/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml index f5788c2e50..419711a7e9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/hazelcast/hazelcast-specific.xml @@ -1,4 +1,4 @@ - diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 4f425a161b..212e4ebf31 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -413,7 +413,7 @@ bom { ] } } - library("Hazelcast", "4.2.4") { + library("Hazelcast", "5.0.2") { group("com.hazelcast") { modules = [ "hazelcast", diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/io/hazelcast.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/io/hazelcast.adoc index 8df03a5862..d9baa5bf09 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/io/hazelcast.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/io/hazelcast.adoc @@ -10,8 +10,8 @@ Spring Boot first attempts to create a client by checking the following configur * A `hazelcast-client.xml` in the working directory or at the root of the classpath. * A `hazelcast-client.yaml` in the working directory or at the root of the classpath. -NOTE: Spring Boot supports both Hazelcast 4 and Hazelcast 3. -If you downgrade to Hazelcast 3, `hazelcast-client` should be added to the classpath to configure a client. +WARNING: Hazelcast 3 support is deprecated. +If you still need to downgrade to Hazelcast 3, `hazelcast-client` should be added to the classpath to configure a client. If a client can not be created, Spring Boot attempts to configure an embedded server. If you define a `com.hazelcast.config.Config` bean, Spring Boot uses that. diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast4ApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast3ApplicationTests.java similarity index 98% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast4ApplicationTests.java rename to spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast3ApplicationTests.java index 5512077212..cedd4cab69 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast4ApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast3/src/test/java/smoketest/hazelcast3/SampleHazelcast3ApplicationTests.java @@ -30,7 +30,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient -class SampleHazelcast4ApplicationTests { +class SampleHazelcast3ApplicationTests { @Autowired private WebTestClient webClient; diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/build.gradle new file mode 100644 index 0000000000..2799093cf4 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/build.gradle @@ -0,0 +1,24 @@ +plugins { + id "java" + id "org.springframework.boot.conventions" +} + +description = "Spring Boot Hazelcast 4 smoke test" + +configurations.all { + resolutionStrategy { + force "com.hazelcast:hazelcast:4.0.5" + force "com.hazelcast:hazelcast-spring:4.0.5" + } +} + +dependencies { + implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-actuator")) + implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-cache")) + implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-web")) + implementation("com.hazelcast:hazelcast") + implementation("com.hazelcast:hazelcast-spring") + + testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test")) + testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-webflux")) +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/Country.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/Country.java new file mode 100644 index 0000000000..9f06e91105 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/Country.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2022 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 + * + * https://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 smoketest.hazelcast4; + +import java.io.Serializable; + +@SuppressWarnings("serial") +public class Country implements Serializable { + + private final String code; + + public Country(String code) { + this.code = code; + } + + public String getCode() { + return this.code; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Country country = (Country) o; + + return this.code.equals(country.code); + } + + @Override + public int hashCode() { + return this.code.hashCode(); + } + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/CountryRepository.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/CountryRepository.java new file mode 100644 index 0000000000..cb233d46b6 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/CountryRepository.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-2022 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 + * + * https://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 smoketest.hazelcast4; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +@Component +@CacheConfig(cacheNames = "countries") +public class CountryRepository { + + @Cacheable + public Country findByCode(String code) { + System.out.println("---> Loading country with code '" + code + "'"); + return new Country(code); + } + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/SampleHazelcast4Application.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/SampleHazelcast4Application.java new file mode 100644 index 0000000000..f879592e64 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/java/smoketest/hazelcast4/SampleHazelcast4Application.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2022 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 + * + * https://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 smoketest.hazelcast4; + +import com.hazelcast.spring.cache.HazelcastCacheManager; + +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.actuate.metrics.cache.CacheMetricsRegistrar; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +@EnableCaching +public class SampleHazelcast4Application { + + public static void main(String[] args) { + SpringApplication.run(SampleHazelcast4Application.class, args); + } + + @Bean + public ApplicationRunner registerCache(CountryRepository repository, HazelcastCacheManager cacheManager, + CacheMetricsRegistrar registrar) { + return (args) -> { + repository.findByCode("BE"); + registrar.bindCacheToRegistry(cacheManager.getCache("countries")); + }; + } + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/application.properties b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/application.properties new file mode 100644 index 0000000000..f896a300ee --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/application.properties @@ -0,0 +1,2 @@ +management.endpoint.health.show-details=always +management.endpoints.web.exposure.include=* diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/hazelcast.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/hazelcast.xml new file mode 100644 index 0000000000..b60f199540 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/main/resources/hazelcast.xml @@ -0,0 +1,20 @@ + + + 600 + + + + + true + true + + + + + + + + + diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/test/java/smoketest/hazelcast4/SampleHazelcast4ApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/test/java/smoketest/hazelcast4/SampleHazelcast4ApplicationTests.java new file mode 100644 index 0000000000..4f81f68a5d --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hazelcast4/src/test/java/smoketest/hazelcast4/SampleHazelcast4ApplicationTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2022 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 + * + * https://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 smoketest.hazelcast4; + +import com.hazelcast.spring.cache.HazelcastCacheManager; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cache.CacheManager; +import org.springframework.test.web.reactive.server.WebTestClient; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureWebTestClient +class SampleHazelcast4ApplicationTests { + + @Autowired + private WebTestClient webClient; + + @Autowired + private CacheManager cacheManager; + + @Autowired + private CountryRepository countryRepository; + + @Test + void cacheManagerIsUsingHazelcast() { + assertThat(this.cacheManager).isInstanceOf(HazelcastCacheManager.class); + } + + @Test + void healthEndpointHasHazelcastContributor() { + this.webClient.get().uri("/actuator/health/hazelcast").exchange().expectStatus().isOk().expectBody() + .jsonPath("status").isEqualTo("UP").jsonPath("details.name").isNotEmpty().jsonPath("details.uuid") + .isNotEmpty(); + } + + @Test + void metricsEndpointHasCacheMetrics() { + this.webClient.get().uri("/actuator/metrics/cache.entries").exchange().expectStatus().isOk(); + } + +}