Merge pull request #24302 from jbertram

* pr/24302:
  Polish "Allow to configure ActiveMQ Artemis with a broker url"
  Allow to configure ActiveMQ Artemis with a broker url

Closes gh-24302
pull/24582/head
Stephane Nicoll 4 years ago
commit 769b5f0f03

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 Eddú Meléndez
* @author Phillip Webb * @author Phillip Webb
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Justin Bertram
*/ */
class ArtemisConnectionFactoryFactory { 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", static final String[] EMBEDDED_JMS_CLASSES = { "org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS",
"org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ" }; "org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ" };
@ -127,19 +130,32 @@ class ArtemisConnectionFactoryFactory {
private <T extends ActiveMQConnectionFactory> T createNativeConnectionFactory(Class<T> factoryClass) private <T extends ActiveMQConnectionFactory> T createNativeConnectionFactory(Class<T> factoryClass)
throws Exception { throws Exception {
T connectionFactory = newNativeConnectionFactory(factoryClass);
String user = this.properties.getUser();
if (StringUtils.hasText(user)) {
connectionFactory.setUser(user);
connectionFactory.setPassword(this.properties.getPassword());
}
return connectionFactory;
}
@SuppressWarnings("deprecation")
private <T extends ActiveMQConnectionFactory> T newNativeConnectionFactory(Class<T> factoryClass) throws Exception {
// Fallback if the broker url is not set
if (!StringUtils.hasText(this.properties.getBrokerUrl()) && StringUtils.hasText(this.properties.getHost())) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put(TransportConstants.HOST_PROP_NAME, this.properties.getHost()); params.put(TransportConstants.HOST_PROP_NAME, this.properties.getHost());
params.put(TransportConstants.PORT_PROP_NAME, this.properties.getPort()); params.put(TransportConstants.PORT_PROP_NAME, this.properties.getPort());
TransportConfiguration transportConfiguration = new TransportConfiguration( TransportConfiguration transportConfiguration = new TransportConfiguration(
NettyConnectorFactory.class.getName(), params); NettyConnectorFactory.class.getName(), params);
Constructor<T> constructor = factoryClass.getConstructor(boolean.class, TransportConfiguration[].class); Constructor<T> constructor = factoryClass.getConstructor(boolean.class, TransportConfiguration[].class);
T 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<T> constructor = factoryClass.getConstructor(String.class);
return constructor.newInstance(brokerUrl);
} }
} }

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.autoconfigure.jms.JmsPoolConnectionFactoryProperties;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
/** /**
@ -32,6 +33,7 @@ import org.springframework.boot.context.properties.NestedConfigurationProperty;
* *
* @author Eddú Meléndez * @author Eddú Meléndez
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Justin Bertram
* @since 1.3.0 * @since 1.3.0
*/ */
@ConfigurationProperties(prefix = "spring.artemis") @ConfigurationProperties(prefix = "spring.artemis")
@ -42,10 +44,15 @@ public class ArtemisProperties {
*/ */
private ArtemisMode mode; private ArtemisMode mode;
/**
* Artemis broker port.
*/
private String brokerUrl;
/** /**
* Artemis broker host. * Artemis broker host.
*/ */
private String host = "localhost"; private String host;
/** /**
* Artemis broker port. * Artemis broker port.
@ -75,18 +82,40 @@ public class ArtemisProperties {
this.mode = mode; 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() { public String getHost() {
return this.host; return this.host;
} }
@Deprecated
public void setHost(String host) { public void setHost(String host) {
this.host = host; this.host = host;
} }
/**
* Return the port of the broker.
* @return the port
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "spring.artemis.broker-url")
public int getPort() { public int getPort() {
return this.port; return this.port;
} }
@Deprecated
public void setPort(int port) { public void setPort(int port) {
this.port = port; this.port = port;
} }

@ -352,6 +352,10 @@
"description": "JMX name of the application admin MBean.", "description": "JMX name of the application admin MBean.",
"defaultValue": "org.springframework.boot:type=Admin,name=SpringApplication" "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", "name": "spring.artemis.pool.maximum-active-session-per-connection",
"deprecation": { "deprecation": {

@ -124,6 +124,15 @@ class ArtemisAutoConfigurationTests {
} }
@Test @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() { void nativeConnectionFactoryCustomHost() {
this.contextRunner.withUserConfiguration(EmptyConfiguration.class) this.contextRunner.withUserConfiguration(EmptyConfiguration.class)
.withPropertyValues("spring.artemis.mode:native", "spring.artemis.host:192.168.1.144", .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)); 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 @Test
void nativeConnectionFactoryCredentials() { void nativeConnectionFactoryCredentials() {
this.contextRunner.withUserConfiguration(EmptyConfiguration.class) this.contextRunner.withUserConfiguration(EmptyConfiguration.class)
@ -377,7 +396,11 @@ class ArtemisAutoConfigurationTests {
TransportConfiguration transportConfig = getSingleTransportConfiguration(connectionFactory); TransportConfiguration transportConfig = getSingleTransportConfiguration(connectionFactory);
assertThat(transportConfig.getFactoryClassName()).isEqualTo(NettyConnectorFactory.class.getName()); assertThat(transportConfig.getFactoryClassName()).isEqualTo(NettyConnectorFactory.class.getName());
assertThat(transportConfig.getParams().get("host")).isEqualTo(host); 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; return transportConfig;
} }

@ -5739,16 +5739,16 @@ By default, ActiveMQ creates a destination if it does not yet exist so that dest
[[boot-features-artemis]] [[boot-features-artemis]]
==== Artemis Support ==== ActiveMQ 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. 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). 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). 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. 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. 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`: For example, you might declare the following section in `application.properties`:
[source,yaml,indent=0,configprops,configblocks] [source,yaml,indent=0,configprops,configblocks]
@ -5756,8 +5756,7 @@ For example, you might declare the following section in `application.properties`
spring: spring:
artemis: artemis:
mode: native mode: native
host: "192.168.1.210" broker-url: "tcp://192.168.1.210:9876"
port: 9876
user: "admin" user: "admin"
password: "secret" password: "secret"
---- ----

Loading…
Cancel
Save