/** * Copyright (c) 2009--2010 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.taskomatic.task.threaded; import org.apache.log4j.Logger; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Provides an easy-to-use way to locate and use threaded * work queues. Each queue is only created once. * @version $Rev$ */ public class TaskQueueFactory { private static TaskQueueFactory instance = new TaskQueueFactory(); private Map queues = new HashMap(); /** * Get the singleton instance * @return the single instance of TaskQueueFactory */ public static TaskQueueFactory get() { return instance; } private TaskQueueFactory() { Runtime.getRuntime().addShutdownHook(new ShutdownHook(this)); } /** * Retrieves a queue by name * @param name queue name * @return queue if found, otherwise null */ public TaskQueue getQueue(String name) { synchronized (queues) { return (TaskQueue) queues.get(name); } } /** * Create the queue, if it doesn't exist already. If the * queue has been created on a previous call to createQueue(), * then that instance is returned instead. * @param name queue name * @param driverClass class to use as the queue driver * @param loggerIn queue logger * @return queue instance * @throws Exception error occurred during queue creation */ public TaskQueue createQueue(String name, Class driverClass, Logger loggerIn) throws Exception { TaskQueue retval = null; synchronized (queues) { retval = (TaskQueue) queues.get(name); if (retval == null) { retval = new TaskQueue(); QueueDriver driver = (QueueDriver) driverClass.newInstance(); driver.setLogger(loggerIn); driver.initialize(); retval.setQueueDriver(driver); queues.put(name, retval); } } return retval; } /** * Removes the queue from the map of available queues. * This DOES NOT shutdown the queue or perform any cleanup. * @param name queue name * @return queue instance if found, otherwise null */ public TaskQueue removeQueue(String name) { TaskQueue retval = null; synchronized (queues) { retval = (TaskQueue) queues.remove(name); } return retval; } void closeAllQueues() { synchronized (queues) { for (Iterator iter = queues.values().iterator(); iter.hasNext();) { TaskQueue queue = (TaskQueue) iter.next(); queue.shutdown(); } } queues.clear(); } /** * JVM shutdown hook used to clean up any remaining queues * @version $Rev$ */ class ShutdownHook extends Thread { private TaskQueueFactory factory; ShutdownHook(TaskQueueFactory factoryIn) { factory = factoryIn; } public void run() { factory.closeAllQueues(); } } }