/*
* Copyright 2015-2016 Red Hat, Inc, and individual contributors.
*
* 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
*
* http://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.wildfly.swarm.messaging;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.wildfly.swarm.config.messaging.activemq.server.BroadcastGroup;
import org.wildfly.swarm.config.messaging.activemq.server.ClusterConnection;
import org.wildfly.swarm.config.messaging.activemq.server.ConnectionFactory;
import org.wildfly.swarm.config.messaging.activemq.server.DiscoveryGroup;
import org.wildfly.swarm.config.messaging.activemq.server.HTTPAcceptor;
import org.wildfly.swarm.config.messaging.activemq.server.HTTPConnector;
import org.wildfly.swarm.config.messaging.activemq.server.JMSQueueConsumer;
import org.wildfly.swarm.config.messaging.activemq.server.JMSTopicConsumer;
import org.wildfly.swarm.config.messaging.activemq.server.PooledConnectionFactory;
/**
* @author Bob McWhirter
*/
@SuppressWarnings("unused")
public class EnhancedServer extends org.wildfly.swarm.config.messaging.activemq.Server<EnhancedServer> {
private static final String IN_VM = "in-vm";
private static final String HTTP_CONNECTOR = "http-connector";
public EnhancedServer(String key) {
super(key);
}
public EnhancedServer enableInVm() {
int serverId = COUNTER.getAndIncrement();
inVmConnector(IN_VM, (c) -> c.serverId(serverId));
inVmAcceptor(IN_VM, (a) -> a.serverId(serverId));
connectionFactory(new ConnectionFactory("InVmConnectionFactory")
.connector(IN_VM)
.entry("java:/ConnectionFactory"));
pooledConnectionFactory(new PooledConnectionFactory("activemq-ra")
.entry("java:jboss/DefaultJMSConnectionFactory")
.entry("java:/JmsXA")
.connector(IN_VM)
.transaction("xa"));
return this;
}
public EnhancedServer enableClustering() {
enableHTTPConnections();
// add the jboss.messaging.cluster.password property to set the ActiveMQ cluster password.
clusterPassword("${jboss.messaging.cluster.password:CHANGE ME!!}");
discoveryGroup(new DiscoveryGroup("activemq-discovery")
.jgroupsChannel("activemq-jgroups-cluster"));
broadcastGroup(new BroadcastGroup("activemq-broadcast")
.jgroupsChannel("activemq-jgroups-cluster")
.connectors(HTTP_CONNECTOR));
clusterConnection(new ClusterConnection("activemq-cluster")
.clusterConnectionAddress("jms")
.connectorName(HTTP_CONNECTOR)
.discoveryGroup("activemq-discovery"));
return this;
}
/**
* Setup a remote connection to a remote message broker.
*
* @param connection The connection defailts.
* @return This server.
*/
public EnhancedServer remoteConnection(RemoteConnection connection) {
return remoteConnection(() -> connection);
}
/**
* Setup a default remote connection to a remote message broker.
*
* <p>By default, it sets up a connection named <code>remote-mq</code>,
* connecting to <code>localhost</code> at port <code>61616</code>.
* The connection factory is named <code>java:/jms/remote-mq</code>.</p>
*
* @return This server.
*/
public EnhancedServer remoteConnection() {
return remoteConnection(MessagingProperties.DEFAULT_REMOTE_MQ_NAME);
}
/**
* Setup a default named remote connection to a remote message broker.
*
* <p>By default, it sets up a connection
* connecting to <code>localhost</code> at port <code>61616</code>.
* The connection factory is named <code>java:/jms/<b>name</b></code>.</p>
*
* @return This server.
*/
public EnhancedServer remoteConnection(String name) {
return remoteConnection(name, (config) -> {
});
}
/**
* Setup a named remote connection to a remote message broker.
*
* @param name The name of the connection.
* @param config The configuration.
* @return This server.
*/
public EnhancedServer remoteConnection(String name, RemoteConnection.Consumer config) {
return remoteConnection(() -> {
RemoteConnection connection = new RemoteConnection(name);
config.accept(connection);
return connection;
});
}
/**
* Setup a remote connection to a remote message broker.
*
* @param supplier The supplier of the configuration.
* @return This server.
*/
public EnhancedServer remoteConnection(RemoteConnection.Supplier supplier) {
RemoteConnection connection = supplier.get();
this.remoteConnections.add(connection);
return this;
}
public EnhancedServer enableRemote() {
enableHTTPConnections();
connectionFactory(new ConnectionFactory<>("RemoteConnectionFactory")
.connectors(Collections.singletonList("http-connector"))
.entries("java:/RemoteConnectionFactory", "java:jboss/exported/jms/RemoteConnectionFactory"));
return this;
}
private EnhancedServer enableHTTPConnections() {
if (this.subresources().acceptor(("http-acceptor")) != null) {
return this;
}
httpAcceptor(new HTTPAcceptor("http-acceptor")
.httpListener("default"));
httpConnector(new HTTPConnector(HTTP_CONNECTOR)
.socketBinding("http")
.endpoint("http-acceptor"));
return this;
}
@SuppressWarnings("unchecked")
@Override
public EnhancedServer jmsQueue(String childKey, JMSQueueConsumer config) {
return super.jmsQueue(childKey, (q) -> {
if (config != null) {
config.accept(q);
}
if (q.entries() == null || q.entries().isEmpty()) {
q.entry("java:/jms/queue/" + childKey);
}
});
}
public EnhancedServer remoteJmsQueue(String childKey) {
remoteJmsQueue(childKey, null);
return this;
}
@SuppressWarnings("unchecked")
public EnhancedServer remoteJmsQueue(String childKey, JMSQueueConsumer config) {
return super.jmsQueue(childKey, (q) -> {
if (config != null) {
config.accept(q);
}
if (q.entries() == null || q.entries().isEmpty()) {
q.entry("java:/jboss/exported/jms/queue/" + childKey);
q.entry("java:/jms/queue/" + childKey);
}
});
}
@SuppressWarnings("unchecked")
@Override
public EnhancedServer jmsTopic(String childKey, JMSTopicConsumer config) {
return super.jmsTopic(childKey, (t) -> {
if (config != null) {
config.accept(t);
}
if (t.entries() == null || t.entries().isEmpty()) {
t.entry("java:/jms/topic/" + childKey);
}
});
}
public EnhancedServer remoteJmsTopic(String childKey) {
remoteJmsTopic(childKey, null);
return this;
}
@SuppressWarnings("unchecked")
public EnhancedServer remoteJmsTopic(String childKey, JMSTopicConsumer config) {
return super.jmsTopic(childKey, (t) -> {
if (config != null) {
config.accept(t);
}
if (t.entries() == null || t.entries().isEmpty()) {
t.entry("java:/jboss/exported/jms/topic/" + childKey);
t.entry("java:/jms/topic/" + childKey);
}
});
}
public List<RemoteConnection> remoteConnections() {
return this.remoteConnections;
}
private List<RemoteConnection> remoteConnections = new ArrayList<>();
private static final AtomicInteger COUNTER = new AtomicInteger();
}