org.apache.servicemix.jms.JmsComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.servicemix.jms.JmsComponent.java

Source

/*
 * 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.servicemix.jms;

import org.apache.servicemix.common.*;
import org.apache.servicemix.common.util.IntrospectionSupport;
import org.apache.servicemix.common.util.URISupport;
import org.apache.servicemix.common.xbean.BaseXBeanDeployer;
import org.apache.servicemix.jms.endpoints.JmsConsumerEndpoint;
import org.apache.servicemix.jms.endpoints.JmsProviderEndpoint;
import org.apache.servicemix.jms.multiplexing.MultiplexingConsumerProcessor;
import org.springframework.jms.listener.AbstractMessageListenerContainer;

import javax.jbi.messaging.MessageExchange;
import javax.jbi.servicedesc.ServiceEndpoint;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Timer;

/**
 * JMS JBI binding component
 * 
 * @org.apache.xbean.XBean element="component"
 */
public class JmsComponent extends DefaultComponent {

    protected JmsConfiguration configuration = new JmsConfiguration();
    protected JmsEndpointType[] endpoints;
    protected ConsumersStopper consumersStopper;
    private Timer stopperTimer;

    protected List getConfiguredEndpoints() {
        return asList(endpoints);
    }

    protected Class[] getEndpointClasses() {
        return new Class[] { JmsEndpoint.class, JmsConsumerEndpoint.class, JmsProviderEndpoint.class };
    }

    /**
     * @return Returns the configuration.
     * @org.apache.xbean.Flat
     */
    public JmsConfiguration getConfiguration() {
        return configuration;
    }

    /**
    * Specifies the configuration bean used to set up the JMS connections for the endpoints. 
    *
    * @param configuration the configuration object 
      */
    public void setConfiguration(JmsConfiguration configuration) {
        this.configuration = configuration;
    }

    public JmsEndpointType[] getEndpoints() {
        return endpoints;
    }

    /**
      * Specifies the list of endpoints hosted by the component.
      *
      * @param endpoints the list of endpoints
      */
    public void setEndpoints(JmsEndpointType[] endpoints) {
        this.endpoints = endpoints;
    }

    /**
     * @return the keystoreManager
     */
    public Object getKeystoreManager() {
        return configuration.getKeystoreManager();
    }

    /**
     * @param keystoreManager the keystoreManager to set
     */
    public void setKeystoreManager(Object keystoreManager) {
        this.configuration.setKeystoreManager(keystoreManager);
    }

    /**
     * @return the authenticationService
     */
    public Object getAuthenticationService() {
        return configuration.getAuthenticationService();
    }

    /**
     * @param authenticationService the authenticationService to set
     */
    public void setAuthenticationService(Object authenticationService) {
        this.configuration.setAuthenticationService(authenticationService);
    }

    /* (non-Javadoc)
     * @see org.servicemix.common.BaseComponentLifeCycle#getExtensionMBean()
     */
    protected Object getExtensionMBean() throws Exception {
        return configuration;
    }

    /* (non-Javadoc)
     * @see org.apache.servicemix.common.BaseComponent#createServiceUnitManager()
     */
    public BaseServiceUnitManager createServiceUnitManager() {
        Deployer[] deployers = new Deployer[] { new BaseXBeanDeployer(this, getEndpointClasses()),
                new JmsWsdl1Deployer(this) };
        return new BaseServiceUnitManager(this, deployers);
    }

    /* (non-Javadoc)
     * @see org.apache.servicemix.common.DefaultComponent#doInit()
     */
    protected void doInit() throws Exception {
        consumersStopper = new ConsumersStopper(context); // must be before ServiceUnit.init()
        super.doInit();
        configuration.setRootDir(context.getWorkspaceRoot());
        configuration.setComponentName(this.context.getComponentName());
        configuration.load();
        // Lookup keystoreManager and authenticationService
        if (configuration.getKeystoreManager() == null) {
            try {
                String name = configuration.getKeystoreManagerName();
                Object km = context.getNamingContext().lookup(name);
                configuration.setKeystoreManager(km);
            } catch (Exception e) {
                // ignore
            }
        }
        if (configuration.getAuthenticationService() == null) {
            try {
                String name = configuration.getAuthenticationServiceName();
                Object as = context.getNamingContext().lookup(name);
                configuration.setAuthenticationService(as);
            } catch (Exception e) {
                try {
                    Class cl = Class
                            .forName("org.apache.servicemix.jbi.security.auth.impl.JAASAuthenticationService");
                    configuration.setAuthenticationService(cl.newInstance());
                } catch (Throwable t) {
                    logger.warn("Unable to retrieve or create the authentication service");
                }
            }
        }
    }

    @Override
    protected void doStart() throws Exception {
        super.doStart();
        scheduleConsumerStopper();
    }

    @Override
    protected void doStop() throws Exception {
        super.doStop();
        if (stopperTimer != null)
            stopperTimer.cancel();
    }

    private void scheduleConsumerStopper() {
        stopperTimer = new Timer("component." + getContext().getComponentName() + ".timer");
        stopperTimer.schedule(consumersStopper.createTimerTask(), 1000, 1000); // TODO: configurable
    }

    protected Endpoint getResolvedEPR(ServiceEndpoint ep) throws Exception {
        // We receive an exchange for an EPR that has not been used yet.
        // Register a provider endpoint and restart processing.
        JmsEndpoint jmsEp = new JmsEndpoint(true);
        jmsEp.setServiceUnit(new DefaultServiceUnit(component));
        jmsEp.setService(ep.getServiceName());
        jmsEp.setEndpoint(ep.getEndpointName());
        jmsEp.setRole(MessageExchange.Role.PROVIDER);
        URI uri = new URI(ep.getEndpointName());
        Map map = URISupport.parseQuery(uri.getQuery());
        if (IntrospectionSupport.setProperties(jmsEp, map, "jms.")) {
            uri = URISupport.createRemainingURI(uri, map);
        }
        if (uri.getPath() != null) {
            String path = uri.getSchemeSpecificPart();
            while (path.startsWith("/")) {
                path = path.substring(1);
            }
            if (path.startsWith(AbstractJmsProcessor.STYLE_QUEUE + "/")) {
                jmsEp.setDestinationStyle(AbstractJmsProcessor.STYLE_QUEUE);
                jmsEp.setJmsProviderDestinationName(path.substring(AbstractJmsProcessor.STYLE_QUEUE.length() + 1));
            } else if (path.startsWith(AbstractJmsProcessor.STYLE_TOPIC + "/")) {
                jmsEp.setDestinationStyle(AbstractJmsProcessor.STYLE_TOPIC);
                jmsEp.setJmsProviderDestinationName(path.substring(AbstractJmsProcessor.STYLE_TOPIC.length() + 1));
            }
        }
        return jmsEp;
    }

    public void addConsumerProcessor(MultiplexingConsumerProcessor multiplexingConsumerProcessor) {
        consumersStopper.addProcessor(multiplexingConsumerProcessor);
    }

    public void removeConsumerProcessor(MultiplexingConsumerProcessor multiplexingConsumerProcessor) {
        consumersStopper.removeProcessor(multiplexingConsumerProcessor);
    }

    public boolean isActive() {
        return consumersStopper.isJmsActiveAvailable();
    }

    public void addListenerContainer(AbstractMessageListenerContainer listenerContainer) {
        consumersStopper.addListenerContainer(listenerContainer);
    }

    public void removeListenerContainer(AbstractMessageListenerContainer listenerContainer) {
        consumersStopper.removeListenerContainer(listenerContainer);
    }
}