All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.openejb.resource.activemq.ActiveMQFactory Maven / Gradle / Ivy

There is a newer version: 4.7.5
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.openejb.resource.activemq;

import org.apache.activemq.broker.BrokerService;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Collection;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;

public class ActiveMQFactory {

    private static final AtomicBoolean initialized = new AtomicBoolean(false);
    private static Method setThreadProperties;
    private static Method createBroker;
    private static Method getBrokers;
    private static Object instance;
    private static Class clazz;
    private static String brokerPrefix;

    private static void init() {

        synchronized (initialized) {

            if (!initialized.getAndSet(true)) {

                Class tmp = null;

                try {
                    tmp = Class.forName("org.apache.openejb.resource.activemq.ActiveMQ5Factory");
                    brokerPrefix = "amq5factory:";
                } catch (java.lang.Throwable t1) {
                    try {
                        tmp = Class.forName("org.apache.openejb.resource.activemq.ActiveMQ4Factory");
                        brokerPrefix = "amq4factory:";
                    } catch (java.lang.Throwable t2) {
                        throw new RuntimeException("Unable to load ActiveMQFactory: Check ActiveMQ jar files are on classpath", t1);
                    }
                }

                clazz = tmp;

                try {
                    instance = clazz.newInstance();
                } catch (InstantiationException e) {
                    throw new RuntimeException("Unable to create ActiveMQFactory instance", e);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("Unable to access ActiveMQFactory instance", e);
                }

                try {
                    setThreadProperties = clazz.getDeclaredMethod("setThreadProperties", new Class[]{Properties.class});
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException("Unable to create ActiveMQFactory setThreadProperties method", e);
                }

                try {
                    createBroker = clazz.getDeclaredMethod("createBroker", new Class[]{URI.class});
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException("Unable to create ActiveMQFactory createBroker method", e);
                }

                try {
                    getBrokers = clazz.getDeclaredMethod("getBrokers", (Class[]) null);
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException("Unable to create ActiveMQFactory createBroker method", e);
                }
            }
        }
    }

    /**
     * Returns the prefix metafile name of the poperties file that ActiveMQ should be
     * provided with. This file is located at META-INF/services/org/apache/activemq/broker/
     * and defines the BrokerFactoryHandler to load.
     * @return String name - will be either 'amq5factory:' or 'amq4factory:' - note the trailing ':'
     */
    public static String getBrokerMetaFile() {
        ActiveMQFactory.init();
        return brokerPrefix;
    }

    public static void setThreadProperties(final Properties p) {

        ActiveMQFactory.init();

        try {
            setThreadProperties.invoke(instance, p);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("ActiveMQFactory.setThreadProperties.IllegalAccessException", e);
        } catch (IllegalArgumentException e) {
            throw new RuntimeException("ActiveMQFactory.setThreadProperties.IllegalArgumentException", e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException("ActiveMQFactory.setThreadProperties.InvocationTargetException", e);
        }
    }

    public BrokerService createBroker(final URI brokerURI) throws Exception {

        ActiveMQFactory.init();

        try {
            return (BrokerService) createBroker.invoke(instance, brokerURI);
        } catch (IllegalAccessException e) {
            throw new Exception("ActiveMQFactory.createBroker.IllegalAccessException", e);
        } catch (IllegalArgumentException e) {
            throw new Exception("ActiveMQFactory.createBroker.IllegalArgumentException", e);
        } catch (InvocationTargetException e) {
            throw new Exception("ActiveMQFactory.createBroker.InvocationTargetException", e);
        }
    }

    /**
     * Returns a map of configured brokers.
     * This intended for access upon RA shutdown in order to wait for the brokers to finish.
     * @return Map
     */
    public static Collection getBrokers() throws Exception {

        ActiveMQFactory.init();

        try {
            return (Collection) getBrokers.invoke(instance, (Object[]) null);
        } catch (IllegalAccessException e) {
            throw new Exception("ActiveMQFactory.createBroker.IllegalAccessException", e);
        } catch (IllegalArgumentException e) {
            throw new Exception("ActiveMQFactory.createBroker.IllegalArgumentException", e);
        } catch (InvocationTargetException e) {
            throw new Exception("ActiveMQFactory.createBroker.InvocationTargetException", e);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy