From 338c8c4fc85d7d99b7d326618cdea5c72b2b8558 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 21 Dec 2020 17:53:10 +0100 Subject: [PATCH] Polish "Allow to configure ActiveMQ Artemis with a broker url" See gh-24302 --- .../ArtemisConnectionFactoryFactory.java | 37 ++++++++------ .../jms/artemis/ArtemisProperties.java | 49 +++++++++++-------- ...itional-spring-configuration-metadata.json | 4 ++ .../ArtemisAutoConfigurationTests.java | 19 +++++-- 4 files changed, 70 insertions(+), 39 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisConnectionFactoryFactory.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisConnectionFactoryFactory.java index 3b1d7ddf17..62de6fb0ed 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisConnectionFactoryFactory.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisConnectionFactoryFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -44,6 +44,8 @@ import org.springframework.util.StringUtils; */ class ArtemisConnectionFactoryFactory { + private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616"; + static final String[] EMBEDDED_JMS_CLASSES = { "org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS", "org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ" }; @@ -128,27 +130,32 @@ class ArtemisConnectionFactoryFactory { private T createNativeConnectionFactory(Class factoryClass) throws Exception { - T connectionFactory; - Map params = new HashMap<>(); - String url = this.properties.getBrokerUrl(); - if (StringUtils.hasText(url)) { - Constructor constructor = factoryClass.getConstructor(String.class); - connectionFactory = constructor.newInstance(url); + T connectionFactory = newNativeConnectionFactory(factoryClass); + String user = this.properties.getUser(); + if (StringUtils.hasText(user)) { + connectionFactory.setUser(user); + connectionFactory.setPassword(this.properties.getPassword()); } - else { + return connectionFactory; + } + + @SuppressWarnings("deprecation") + private T newNativeConnectionFactory(Class factoryClass) throws Exception { + // Fallback if the broker url is not set + if (!StringUtils.hasText(this.properties.getBrokerUrl()) && StringUtils.hasText(this.properties.getHost())) { + Map params = new HashMap<>(); params.put(TransportConstants.HOST_PROP_NAME, this.properties.getHost()); params.put(TransportConstants.PORT_PROP_NAME, this.properties.getPort()); TransportConfiguration transportConfiguration = new TransportConfiguration( NettyConnectorFactory.class.getName(), params); Constructor constructor = factoryClass.getConstructor(boolean.class, TransportConfiguration[].class); - connectionFactory = constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration }); + return constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration }); } - String user = this.properties.getUser(); - if (StringUtils.hasText(user)) { - connectionFactory.setUser(user); - connectionFactory.setPassword(this.properties.getPassword()); - } - return connectionFactory; + String brokerUrl = StringUtils.hasText(this.properties.getBrokerUrl()) ? this.properties.getBrokerUrl() + : DEFAULT_BROKER_URL; + Constructor constructor = factoryClass.getConstructor(String.class); + return constructor.newInstance(brokerUrl); + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java index 50103b696a..34fd02b7f4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -25,6 +25,7 @@ import org.apache.activemq.artemis.core.remoting.impl.invm.TransportConstants; import org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryProperties; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty; /** @@ -44,25 +45,19 @@ public class ArtemisProperties { private ArtemisMode mode; /** - * Artemis broker host. - * - * This property is deprecated. Use brokerUrl instead. + * Artemis broker port. */ - @Deprecated - private String host = "localhost"; + private String brokerUrl; /** - * Artemis broker port. - * - * This property is deprecated. Use brokerUrl instead. + * Artemis broker host. */ - @Deprecated - private int port = 61616; + private String host; /** * Artemis broker port. */ - private String brokerUrl = "tcp://localhost:61616"; + private int port = 61616; /** * Login user of the broker. @@ -87,30 +82,44 @@ public class ArtemisProperties { this.mode = mode; } + public String getBrokerUrl() { + return this.brokerUrl; + } + + public void setBrokerUrl(String brokerUrl) { + this.brokerUrl = brokerUrl; + } + + /** + * Return the host of the broker. + * @return the host + */ + @Deprecated + @DeprecatedConfigurationProperty(replacement = "spring.artemis.broker-url") public String getHost() { return this.host; } + @Deprecated public void setHost(String host) { this.host = host; } + /** + * Return the port of the broker. + * @return the port + */ + @Deprecated + @DeprecatedConfigurationProperty(replacement = "spring.artemis.broker-url") public int getPort() { return this.port; } + @Deprecated public void setPort(int port) { this.port = port; } - public String getBrokerUrl() { - return this.brokerUrl; - } - - public void setBrokerUrl(String brokerUrl) { - this.brokerUrl = brokerUrl; - } - public String getUser() { return this.user; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 40e775faf4..d3ff212ece 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -352,6 +352,10 @@ "description": "JMX name of the application admin MBean.", "defaultValue": "org.springframework.boot:type=Admin,name=SpringApplication" }, + { + "name": "spring.artemis.broker-url", + "defaultValue": "tcp://localhost:61616" + }, { "name": "spring.artemis.pool.maximum-active-session-per-connection", "deprecation": { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisAutoConfigurationTests.java index eb5d9fed36..515a4306bf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisAutoConfigurationTests.java @@ -124,20 +124,31 @@ class ArtemisAutoConfigurationTests { } @Test + void nativeConnectionFactoryCustomBrokerUrl() { + this.contextRunner.withUserConfiguration(EmptyConfiguration.class) + .withPropertyValues("spring.artemis.mode:native", "spring.artemis.broker-url:tcp://192.168.1.144:9876") + .run((context) -> assertNettyConnectionFactory( + getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.144", 9876)); + } + + @Test + @Deprecated void nativeConnectionFactoryCustomHost() { this.contextRunner.withUserConfiguration(EmptyConfiguration.class) .withPropertyValues("spring.artemis.mode:native", "spring.artemis.host:192.168.1.144", - "spring.artemis.port:9876", "spring.artemis.broker-url: ") + "spring.artemis.port:9876") .run((context) -> assertNettyConnectionFactory( getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.144", 9876)); } @Test - void nativeConnectionFactoryCustomUrl() { + @Deprecated + void nativeConnectionFactoryCustomBrokerUrlAndHost() { this.contextRunner.withUserConfiguration(EmptyConfiguration.class) - .withPropertyValues("spring.artemis.mode:native", "spring.artemis.broker-url:tcp://192.168.1.144:9876") + .withPropertyValues("spring.artemis.mode:native", "spring.artemis.host:192.168.1.144", + "spring.artemis.port:9876", "spring.artemis.broker-url=tcp://192.168.1.221:6543") .run((context) -> assertNettyConnectionFactory( - getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.144", 9876)); + getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.221", 6543)); } @Test