org.mule.transport.jms.redelivery.AutoDiscoveryRedeliveryHandlerFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.mule.transport.jms.redelivery.AutoDiscoveryRedeliveryHandlerFactory.java

Source

/*
 * $Id$
 * --------------------------------------------------------------------------------------
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 *
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */

package org.mule.transport.jms.redelivery;

import org.mule.config.i18n.CoreMessages;
import org.mule.transport.jms.JmsConnector;
import org.mule.transport.jms.JmsConstants;

import java.util.Enumeration;
import java.util.concurrent.atomic.AtomicReference;

import javax.jms.ConnectionMetaData;
import javax.jms.JMSException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This factory will consult JMS connection metadata for supported optional properties and use
 * those, if available, otherwise falling back to the manual counting of redeliveries.
 *
 * @see CountingRedeliveryHandlerFactory
 * @see org.mule.transport.jms.redelivery.JmsXRedeliveryHandlerFactory
 * @see javax.jms.ConnectionMetaData
 */
public class AutoDiscoveryRedeliveryHandlerFactory implements RedeliveryHandlerFactory {
    protected final Log logger = LogFactory.getLog(getClass());

    protected AtomicReference<RedeliveryHandler> delegateHandler = new AtomicReference<RedeliveryHandler>(null);

    protected JmsConnector connector;

    public AutoDiscoveryRedeliveryHandlerFactory(JmsConnector connector) {
        if (connector == null) {
            throw new IllegalArgumentException(CoreMessages.objectIsNull("connector").getMessage());
        }
        this.connector = connector;
    }

    public RedeliveryHandler create() {
        RedeliveryHandler result;

        // initialize, accounting for concurrency
        if (delegateHandler.get() == null) {
            RedeliveryHandler newInstance = createInstance();
            boolean ok = delegateHandler.compareAndSet(null, newInstance);
            if (!ok) {
                // someone was faster to initialize it, use this ref instead
                result = delegateHandler.get();
            } else {
                result = newInstance;
            }
        } else {
            // just re-use existing handler
            result = delegateHandler.get();
        }

        return result;
    }

    /**
     * Create an instance using the discovery mechanism.
     *
     * @return an implementation based on the results of discovery
     */
    protected RedeliveryHandler createInstance() {
        RedeliveryHandler newInstance;
        try {
            ConnectionMetaData metaData = connector.getConnection().getMetaData();
            boolean supportsDeliveryCount = false;
            final Enumeration propNames = metaData.getJMSXPropertyNames();
            while (propNames.hasMoreElements()) {
                String p = (String) propNames.nextElement();
                if (JmsConstants.JMS_X_DELIVERY_COUNT.equals(p)) {
                    supportsDeliveryCount = true;
                    break;
                }
            }

            newInstance = (supportsDeliveryCount) ? new JmsXRedeliveryHandler() : new CountingRedeliveryHandler();
        } catch (JMSException e) {
            // fallback to defaults
            newInstance = new CountingRedeliveryHandler();
        }

        if (logger.isDebugEnabled()) {
            logger.debug("Using " + newInstance.getClass().getName());
        }

        return newInstance;
    }

}