diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java index 33abb53377..d28b82a8e7 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * 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. @@ -16,15 +16,12 @@ package org.springframework.boot.actuate.hazelcast; -import java.lang.reflect.Method; - import com.hazelcast.core.HazelcastInstance; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.util.Assert; -import org.springframework.util.ReflectionUtils; /** * {@link HealthIndicator} for Hazelcast. @@ -46,22 +43,10 @@ public class HazelcastHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) { this.hazelcast.executeTransaction((context) -> { - builder.up().withDetail("name", this.hazelcast.getName()).withDetail("uuid", extractUuid()); + String uuid = this.hazelcast.getLocalEndpoint().getUuid().toString(); + builder.up().withDetail("name", this.hazelcast.getName()).withDetail("uuid", uuid); return null; }); } - private String extractUuid() { - try { - return this.hazelcast.getLocalEndpoint().getUuid().toString(); - } - catch (NoSuchMethodError ex) { - // Hazelcast 3 - Method endpointAccessor = ReflectionUtils.findMethod(HazelcastInstance.class, "getLocalEndpoint"); - Object endpoint = ReflectionUtils.invokeMethod(endpointAccessor, this.hazelcast); - Method uuidAccessor = ReflectionUtils.findMethod(endpoint.getClass(), "getUuid"); - return (String) ReflectionUtils.invokeMethod(uuidAccessor, endpoint); - } - } - } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/hazelcast/Hazelcast3HazelcastHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/hazelcast/Hazelcast3HazelcastHealthIndicatorTests.java deleted file mode 100644 index 7fb13886ee..0000000000 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/hazelcast/Hazelcast3HazelcastHealthIndicatorTests.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 org.springframework.boot.actuate.hazelcast; - -import com.hazelcast.core.HazelcastException; -import com.hazelcast.core.HazelcastInstance; -import org.junit.jupiter.api.Test; - -import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.Status; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.boot.testsupport.classpath.ClassPathExclusions; -import org.springframework.boot.testsupport.classpath.ClassPathOverrides; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * Tests for {@link HazelcastHealthIndicator} with Hazelcast 3. - * - * @author Dmytro Nosan - * @author Stephane Nicoll - */ -@ClassPathExclusions("hazelcast*.jar") -@ClassPathOverrides("com.hazelcast:hazelcast:3.12.12") -class Hazelcast3HazelcastHealthIndicatorTests { - - @Test - void hazelcastUp() { - new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(HazelcastAutoConfiguration.class)) - .withPropertyValues("spring.hazelcast.config=hazelcast-3.xml").run((context) -> { - HazelcastInstance hazelcast = context.getBean(HazelcastInstance.class); - Health health = new HazelcastHealthIndicator(hazelcast).health(); - assertThat(health.getStatus()).isEqualTo(Status.UP); - assertThat(health.getDetails()).containsOnlyKeys("name", "uuid").containsEntry("name", - "actuator-hazelcast-3"); - assertThat(health.getDetails().get("uuid")).asString().isNotEmpty(); - }); - } - - @Test - void hazelcastDown() { - HazelcastInstance hazelcast = mock(HazelcastInstance.class); - given(hazelcast.executeTransaction(any())).willThrow(new HazelcastException()); - Health health = new HazelcastHealthIndicator(hazelcast).health(); - assertThat(health.getStatus()).isEqualTo(Status.DOWN); - } - -} diff --git a/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast-3.xml b/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast-3.xml deleted file mode 100644 index 1d6e65e889..0000000000 --- a/spring-boot-project/spring-boot-actuator/src/test/resources/hazelcast-3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - actuator-hazelcast-3 - - - - - - - - diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java index 8f6f5148ca..862bf9ec16 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * 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. @@ -19,19 +19,10 @@ package org.springframework.boot.autoconfigure.hazelcast; import com.hazelcast.core.HazelcastInstance; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionMessage; -import org.springframework.boot.autoconfigure.condition.ConditionMessage.Builder; -import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration.HazelcastDataGridCondition; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.core.io.Resource; -import org.springframework.core.type.AnnotatedTypeMetadata; /** * {@link EnableAutoConfiguration Auto-configuration} for Hazelcast IMDG. Creates a @@ -44,26 +35,9 @@ import org.springframework.core.type.AnnotatedTypeMetadata; * @see HazelcastConfigResourceCondition */ @Configuration(proxyBeanMethods = false) -@Conditional(HazelcastDataGridCondition.class) @ConditionalOnClass(HazelcastInstance.class) @EnableConfigurationProperties(HazelcastProperties.class) @Import({ HazelcastClientConfiguration.class, HazelcastServerConfiguration.class }) public class HazelcastAutoConfiguration { - static class HazelcastDataGridCondition extends SpringBootCondition { - - private static final String HAZELCAST_JET_CONFIG_FILE = "classpath:/hazelcast-jet-default.yaml"; - - @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { - Builder message = ConditionMessage.forCondition(HazelcastDataGridCondition.class.getSimpleName()); - Resource resource = context.getResourceLoader().getResource(HAZELCAST_JET_CONFIG_FILE); - if (resource.exists()) { - return ConditionOutcome.noMatch(message.because("Found Hazelcast Jet on the classpath")); - } - return ConditionOutcome.match(message.because("Hazelcast Jet not found on the classpath")); - } - - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfigAvailableCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfigAvailableCondition.java index a08a40da19..d756be77fd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfigAvailableCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastClientConfigAvailableCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * 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. @@ -45,7 +45,7 @@ class HazelcastClientConfigAvailableCondition extends HazelcastConfigResourceCon @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { if (context.getEnvironment().containsProperty(HAZELCAST_CONFIG_PROPERTY)) { - ConditionOutcome configValidationOutcome = Hazelcast4ClientValidation.clientConfigOutcome(context, + ConditionOutcome configValidationOutcome = HazelcastClientValidation.clientConfigOutcome(context, HAZELCAST_CONFIG_PROPERTY, startConditionMessage()); return (configValidationOutcome != null) ? configValidationOutcome : ConditionOutcome .match(startConditionMessage().foundExactly("property " + HAZELCAST_CONFIG_PROPERTY)); @@ -53,7 +53,7 @@ class HazelcastClientConfigAvailableCondition extends HazelcastConfigResourceCon return getResourceOutcome(context, metadata); } - static class Hazelcast4ClientValidation { + static class HazelcastClientValidation { static ConditionOutcome clientConfigOutcome(ConditionContext context, String propertyName, Builder builder) { String resourcePath = context.getEnvironment().getProperty(propertyName); @@ -65,7 +65,7 @@ class HazelcastClientConfigAvailableCondition extends HazelcastConfigResourceCon boolean clientConfig = new ClientConfigRecognizer().isRecognized(new ConfigStream(in)); return new ConditionOutcome(clientConfig, existingConfigurationOutcome(resource, clientConfig)); } - catch (Throwable ex) { // Hazelcast 4 specific API + catch (Throwable ex) { return null; } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/Hazelcast3AutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/Hazelcast3AutoConfigurationTests.java deleted file mode 100644 index c89b9bf638..0000000000 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/Hazelcast3AutoConfigurationTests.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 org.springframework.boot.autoconfigure.hazelcast; - -import com.hazelcast.client.impl.clientside.HazelcastClientProxy; -import com.hazelcast.config.Config; -import com.hazelcast.core.Hazelcast; -import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.spring.context.SpringManagedContext; -import org.assertj.core.api.Condition; -import org.junit.jupiter.api.Test; - -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.assertj.AssertableApplicationContext; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.boot.test.context.runner.ContextConsumer; -import org.springframework.boot.testsupport.classpath.ClassPathExclusions; -import org.springframework.boot.testsupport.classpath.ClassPathOverrides; -import org.springframework.core.io.ClassPathResource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HazelcastAutoConfiguration} with Hazelcast 3. - * - * @author Stephane Nicoll - */ -@ClassPathExclusions("hazelcast*.jar") -@ClassPathOverrides({ "com.hazelcast:hazelcast:3.12.12", "com.hazelcast:hazelcast-client:3.12.12", - "com.hazelcast:hazelcast-spring:3.12.12" }) -class Hazelcast3AutoConfigurationTests { - - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(HazelcastAutoConfiguration.class)); - - @Test - void defaultConfigFile() { - // no hazelcast-client.xml and hazelcast.xml is present in root classpath - // this also asserts that XML has priority over YAML - // as both hazelcast.yaml and hazelcast.xml in test classpath. - this.contextRunner.run((context) -> { - Config config = context.getBean(HazelcastInstance.class).getConfig(); - assertThat(config.getConfigurationUrl()).isEqualTo(new ClassPathResource("hazelcast.xml").getURL()); - }); - } - - @Test - void explicitConfigFileWithXml() { - HazelcastInstance hazelcastServer = Hazelcast.newHazelcastInstance(); - try { - this.contextRunner - .withPropertyValues("spring.hazelcast.config=org/springframework/boot/autoconfigure/" - + "hazelcast/hazelcast-client-specific.xml") - .run(assertSpecificHazelcastClient("explicit-xml")); - } - finally { - hazelcastServer.shutdown(); - } - } - - @Test - void autoConfiguredConfigUsesSpringManagedContext() { - this.contextRunner.run((context) -> { - Config config = context.getBean(HazelcastInstance.class).getConfig(); - assertThat(config.getManagedContext()).isInstanceOf(SpringManagedContext.class); - }); - } - - private ContextConsumer assertSpecificHazelcastClient(String label) { - return (context) -> assertThat(context).getBean(HazelcastInstance.class).isInstanceOf(HazelcastInstance.class) - .has(labelEqualTo(label)); - } - - private static Condition labelEqualTo(String label) { - return new Condition<>((o) -> ((HazelcastClientProxy) o).getClientConfig().getLabels().stream() - .anyMatch((e) -> e.equals(label)), "Label equals to " + label); - } - -} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java index 6e941f9282..a4aae808a9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * 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. @@ -16,10 +16,6 @@ package org.springframework.boot.autoconfigure.hazelcast; -import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; - import com.hazelcast.config.Config; import com.hazelcast.core.HazelcastInstance; import org.junit.jupiter.api.Test; @@ -27,7 +23,6 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; import static org.assertj.core.api.Assertions.assertThat; @@ -52,41 +47,4 @@ class HazelcastAutoConfigurationTests { }); } - @Test - void hazelcastInstanceNotCreatedWhenJetIsPresent() { - this.contextRunner.withClassLoader(new JetConfigClassLoader()) - .run((context) -> assertThat(context).doesNotHaveBean(HazelcastInstance.class)); - } - - /** - * A test {@link URLClassLoader} that emulates the default Hazelcast Jet configuration - * file exists on the classpath. - */ - static class JetConfigClassLoader extends URLClassLoader { - - private static final Resource FALLBACK = new ClassPathResource("hazelcast.yaml"); - - JetConfigClassLoader() { - super(new URL[0], JetConfigClassLoader.class.getClassLoader()); - } - - @Override - public URL getResource(String name) { - if (name.equals("hazelcast-jet-default.yaml")) { - return getEmulatedJetConfigUrl(); - } - return super.getResource(name); - } - - private URL getEmulatedJetConfigUrl() { - try { - return FALLBACK.getURL(); - } - catch (IOException ex) { - throw new IllegalArgumentException(ex); - } - } - - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/session/hazelcast-3.xml b/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/session/hazelcast-3.xml deleted file mode 100644 index f8af559150..0000000000 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/session/hazelcast-3.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - 3600 - 600 - - - - - - - - - - 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 d9baa5bf09..b0870edd2c 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,9 +10,6 @@ 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. -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. If your configuration defines an instance name, Spring Boot tries to locate an existing instance rather than creating a new one.