/*
* 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 com.github.sakserv.minicluster.impl;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.sakserv.minicluster.MiniCluster;
import com.github.sakserv.minicluster.config.ConfigVars;
import com.github.sakserv.minicluster.util.FileUtils;
public class ActivemqLocalBroker implements MiniCluster {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(ActivemqLocalBroker.class);
private final String hostName;
private final Integer port;
private final String queueName;
private final String storeDir;
private final String uriPrefix;
private final String uriPostfix;
private BrokerService broker;
private Destination dest;
private Session session;
private MessageConsumer consumer;
private MessageProducer producer;
private ActivemqLocalBroker(Builder builder) {
this.hostName = builder.hostName;
this.port = builder.port;
this.queueName = builder.queueName;
this.storeDir = builder.storeDir;
this.uriPrefix = builder.uriPrefix;
this.uriPostfix = builder.uriPostfix;
}
public String getHostName() {
return hostName;
}
public int getPort() {
return port;
}
public String getQueueName() {
return queueName;
}
public String getStoreDir() {
return storeDir;
}
public String getUriPrefix() {
return uriPrefix;
}
public String getUriPostfix() {
return uriPostfix;
}
public static class Builder
{
private String hostName;
private Integer port;
private String queueName;
private String storeDir;
private String uriPrefix;
private String uriPostfix;
public Builder setHostName(String hostName) {
this.hostName = hostName;
return this;
}
public Builder setPort(int port) {
this.port = port;
return this;
}
public Builder setQueueName(String queueName) {
this.queueName = queueName;
return this;
}
public Builder setStoreDir(String storeDir) {
this.storeDir = storeDir;
return this;
}
public Builder setUriPrefix(String uriPrefix) {
this.uriPrefix = uriPrefix;
return this;
}
public Builder setUriPostfix(String uriPostfix) {
this.uriPostfix = uriPostfix;
return this;
}
public ActivemqLocalBroker build() {
ActivemqLocalBroker activemqLocalBroker = new ActivemqLocalBroker(this);
validateObject(activemqLocalBroker);
return activemqLocalBroker;
}
private void validateObject(ActivemqLocalBroker activemqLocalBroker) {
if(activemqLocalBroker.hostName == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ HostName");
}
if(activemqLocalBroker.port == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ Port");
}
if(activemqLocalBroker.queueName == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ Queue Name");
}
if(activemqLocalBroker.storeDir == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ Store Dir");
}
if(activemqLocalBroker.uriPrefix == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ Uri Prefix");
}
if(activemqLocalBroker.uriPostfix == null) {
throw new IllegalArgumentException("ERROR: Missing required config: ActiveMQ Uri Postfix");
}
}
}
@Override
public void start() throws Exception {
String uri = uriPrefix + hostName + ":" + port;
LOG.info("ACTIVEMQ: Starting ActiveMQ on {}", uri);
configure();
broker = new BrokerService();
broker.addConnector(uri);
broker.start();
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(uri + uriPostfix);
Connection conn = factory.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
dest = session.createQueue(queueName);
consumer = session.createConsumer(dest);
producer = session.createProducer(dest);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
@Override
public void stop() throws Exception {
stop(true);
}
@Override
public void stop(boolean cleanUp) throws Exception {
LOG.info("ACTIVEMQ: Stopping ActiveMQ");
consumer.close();
session.close();
broker.stop();
if(cleanUp) {
cleanUp();
}
}
@Override
public void configure() throws Exception {
Properties props = System.getProperties();
props.setProperty(ConfigVars.ACTIVEMQ_STORE_DIR_KEY, storeDir);
}
@Override
public void cleanUp() throws Exception {
FileUtils.deleteFolder(storeDir);
}
public void sendTextMessage(String text) throws JMSException {
TextMessage msg = session.createTextMessage(text);
producer.send(dest,msg);
}
public String getTextMessage() throws JMSException {
Message msg = consumer.receive(100);
return ((TextMessage) msg).getText();
}
}