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 e8b9979189..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. @@ -40,9 +40,12 @@ import org.springframework.util.StringUtils; * @author Eddú Meléndez * @author Phillip Webb * @author Stephane Nicoll + * @author Justin Bertram */ 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" }; @@ -127,13 +130,7 @@ class ArtemisConnectionFactoryFactory { private T createNativeConnectionFactory(Class factoryClass) throws Exception { - 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); - T connectionFactory = constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration }); + T connectionFactory = newNativeConnectionFactory(factoryClass); String user = this.properties.getUser(); if (StringUtils.hasText(user)) { connectionFactory.setUser(user); @@ -142,4 +139,23 @@ class ArtemisConnectionFactoryFactory { 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); + return constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration }); + } + 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 1b227f60a7..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; /** @@ -32,6 +33,7 @@ import org.springframework.boot.context.properties.NestedConfigurationProperty; * * @author Eddú Meléndez * @author Stephane Nicoll + * @author Justin Bertram * @since 1.3.0 */ @ConfigurationProperties(prefix = "spring.artemis") @@ -42,10 +44,15 @@ public class ArtemisProperties { */ private ArtemisMode mode; + /** + * Artemis broker port. + */ + private String brokerUrl; + /** * Artemis broker host. */ - private String host = "localhost"; + private String host; /** * Artemis broker port. @@ -75,18 +82,40 @@ 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; } 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 b93e4a45b5..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,6 +124,15 @@ 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", @@ -132,6 +141,16 @@ class ArtemisAutoConfigurationTests { getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.144", 9876)); } + @Test + @Deprecated + void nativeConnectionFactoryCustomBrokerUrlAndHost() { + 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=tcp://192.168.1.221:6543") + .run((context) -> assertNettyConnectionFactory( + getActiveMQConnectionFactory(getConnectionFactory(context)), "192.168.1.221", 6543)); + } + @Test void nativeConnectionFactoryCredentials() { this.contextRunner.withUserConfiguration(EmptyConfiguration.class) @@ -377,7 +396,11 @@ class ArtemisAutoConfigurationTests { TransportConfiguration transportConfig = getSingleTransportConfiguration(connectionFactory); assertThat(transportConfig.getFactoryClassName()).isEqualTo(NettyConnectorFactory.class.getName()); assertThat(transportConfig.getParams().get("host")).isEqualTo(host); - assertThat(transportConfig.getParams().get("port")).isEqualTo(port); + Object transportConfigPort = transportConfig.getParams().get("port"); + if (transportConfigPort instanceof String) { + transportConfigPort = Integer.parseInt((String) transportConfigPort); + } + assertThat(transportConfigPort).isEqualTo(port); return transportConfig; } diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc index ad397b8e2d..6685945359 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc @@ -5739,16 +5739,16 @@ By default, ActiveMQ creates a destination if it does not yet exist so that dest [[boot-features-artemis]] -==== Artemis Support -Spring Boot can auto-configure a `ConnectionFactory` when it detects that https://activemq.apache.org/components/artemis/[Artemis] is available on the classpath. +==== ActiveMQ Artemis Support +Spring Boot can auto-configure a `ConnectionFactory` when it detects that https://activemq.apache.org/components/artemis/[ActiveMQ Artemis] is available on the classpath. If the broker is present, an embedded broker is automatically started and configured (unless the mode property has been explicitly set). The supported modes are `embedded` (to make explicit that an embedded broker is required and that an error should occur if the broker is not available on the classpath) and `native` (to connect to a broker using the `netty` transport protocol). When the latter is configured, Spring Boot configures a `ConnectionFactory` that connects to a broker running on the local machine with the default settings. -NOTE: If you use `spring-boot-starter-artemis`, the necessary dependencies to connect to an existing Artemis instance are provided, as well as the Spring infrastructure to integrate with JMS. +NOTE: If you use `spring-boot-starter-artemis`, the necessary dependencies to connect to an existing ActiveMQ Artemis instance are provided, as well as the Spring infrastructure to integrate with JMS. Adding `org.apache.activemq:artemis-jms-server` to your application lets you use embedded mode. -Artemis configuration is controlled by external configuration properties in `+spring.artemis.*+`. +ActiveMQ Artemis configuration is controlled by external configuration properties in `+spring.artemis.*+`. For example, you might declare the following section in `application.properties`: [source,yaml,indent=0,configprops,configblocks] @@ -5756,8 +5756,7 @@ For example, you might declare the following section in `application.properties` spring: artemis: mode: native - host: "192.168.1.210" - port: 9876 + broker-url: "tcp://192.168.1.210:9876" user: "admin" password: "secret" ----