/*************************GO-LICENSE-START*********************************
* Copyright 2014 ThoughtWorks, Inc.
*
* 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.server.messaging.activemq;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import com.thoughtworks.go.server.service.support.DaemonThreadStatsCollector;
import com.thoughtworks.go.server.messaging.GoMessageListener;
import com.thoughtworks.go.server.messaging.MessageSender;
import com.thoughtworks.go.server.messaging.MessagingService;
import com.thoughtworks.go.util.SystemEnvironment;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.region.Destination;
import org.apache.activemq.broker.region.Subscription;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.util.BrokerSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import static com.thoughtworks.go.util.ExceptionUtils.bomb;
@Component
public class ActiveMqMessagingService implements MessagingService {
public static final String BROKER_NAME = "go-server";
public static final String BROKER_URL = "vm://go-server";
private final DaemonThreadStatsCollector daemonThreadStatsCollector;
private ActiveMQConnection connection;
public ActiveMQConnectionFactory factory;
private BrokerService broker;
@Autowired
public ActiveMqMessagingService(DaemonThreadStatsCollector daemonThreadStatsCollector) throws Exception {
this.daemonThreadStatsCollector = daemonThreadStatsCollector;
SystemEnvironment systemEnvironment = new SystemEnvironment();
broker = new BrokerService();
broker.setBrokerName(BROKER_NAME);
broker.setPersistent(false);
broker.setUseJmx(systemEnvironment.getActivemqUseJmx());
broker.getManagementContext().setConnectorPort(systemEnvironment.getActivemqConnectorPort());
broker.start();
factory = new ActiveMQConnectionFactory(BROKER_URL);
factory.getPrefetchPolicy().setQueuePrefetch(systemEnvironment.getActivemqQueuePrefetch());
factory.setCopyMessageOnSend(false);
connection = (ActiveMQConnection) factory.createConnection();
connection.start();
}
public MessageSender createSender(String topic) {
try {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(session.createTopic(topic));
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
return new ActiveMqMessageSender(session, producer);
} catch (Exception e) {
throw bomb(e);
}
}
public JMSMessageListenerAdapter addListener(String topic, final GoMessageListener listener) {
try {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(session.createTopic(topic));
return JMSMessageListenerAdapter.startListening(consumer, listener, daemonThreadStatsCollector);
} catch (Exception e) {
throw bomb(e);
}
}
public MessageSender createQueueSender(String queueName) {
try {
Session session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(session.createQueue(queueName));
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
return new ActiveMqMessageSender(session, producer);
} catch (Exception e) {
throw bomb(e);
}
}
public JMSMessageListenerAdapter addQueueListener(String queueName, final GoMessageListener listener) {
try {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(session.createQueue(queueName));
return JMSMessageListenerAdapter.startListening(consumer, listener, daemonThreadStatsCollector);
} catch (Exception e) {
throw bomb(e);
}
}
public void removeQueue(String queueName) {
try {
ActiveMQQueue destination = new ActiveMQQueue(queueName);
ConnectionContext connectionContext = BrokerSupport.getConnectionContext(broker.getBroker());
Destination brokerDestination = broker.getDestination(destination);
List<Subscription> consumers = brokerDestination.getConsumers();
for (Subscription consumer : consumers) {
consumer.remove(connectionContext, brokerDestination);
brokerDestination.removeSubscription(connectionContext, consumer, 0);
}
broker.getBroker().removeDestination(connectionContext, destination, 1000);
broker.removeDestination(destination);
} catch (Exception e) {
throw bomb(e);
}
}
public void stop() throws JMSException {
connection.close();
try {
broker.stop();
} catch (Exception e) {
}
}
}