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");
* 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,19 +130,32 @@ class ArtemisConnectionFactoryFactory {
private <T extends ActiveMQConnectionFactory> T createNativeConnectionFactory(Class<T> factoryClass)
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<>();
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<T> constructor = factoryClass.getConstructor(boolean.class, TransportConfiguration[].class);
T connectionFactory = constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration });
String user = this.properties.getUser();
if (StringUtils.hasText(user)) {
connectionFactory.setUser(user);
connectionFactory.setPassword(this.properties.getPassword());
return constructor.newInstance(false, new TransportConfiguration[] { transportConfiguration });
}
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");
* 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;
}

@ -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": {

@ -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;
}

@ -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"
----

Loading…
Cancel
Save