001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.activemq.transport.http;
019
020 import javax.jms.JMSException;
021 import javax.servlet.ServletException;
022
023 import org.activemq.broker.BrokerContainer;
024 import org.activemq.broker.BrokerContext;
025 import org.activemq.spring.SpringBrokerContainerFactory;
026 import org.activemq.transport.TransportChannelListener;
027 import org.activemq.transport.TransportServerChannelSupport;
028 import org.activemq.util.IdGenerator;
029 import org.springframework.core.io.ClassPathResource;
030
031 /**
032 * This servlet embeds an ActiveMQ broker inside a servlet engine which is
033 * ideal for deploying ActiveMQ inside a WAR and using this servlet as a HTTP tunnel.
034 *
035 * @version $Revision$
036 */
037 public class HttpSpringEmbeddedTunnelServlet extends HttpTunnelServlet {
038
039 private static final long serialVersionUID = 8943695476238731241L;
040 private BrokerContainer broker;
041 private ServletConnector transportConnector;
042
043 public synchronized void init() throws ServletException {
044 // lets initialize the ActiveMQ broker
045 if (broker == null) {
046 broker = createBroker();
047 }
048 try {
049 broker.start();
050 }
051 catch (JMSException e) {
052 throw new ServletException("Failed to start embedded broker: " + e, e);
053 }
054 // now lets register the listener
055 TransportChannelListener listener = transportConnector.getTransportChannelListener();
056 getServletContext().setAttribute("transportChannelListener", listener);
057 super.init();
058 }
059
060 protected static class ServletConnector extends TransportServerChannelSupport {
061 public ServletConnector(String url) {
062 super(url);
063 }
064 }
065
066 /**
067 * Factory method to create a new broker
068 */
069 protected BrokerContainer createBroker() {
070
071 String configFile = getServletContext().getInitParameter("org.activemq.config.file");
072 if (configFile == null) {
073 configFile="activemq.xml";
074 }
075
076 SpringBrokerContainerFactory factory = new SpringBrokerContainerFactory();
077 System.out.println("Loading Message Broker from "+configFile+" on the CLASSPATH");
078 factory.setResource(new ClassPathResource(configFile));
079
080 IdGenerator idgen = new IdGenerator();
081 BrokerContainer answer = factory.createBrokerContainer(idgen.generateId(), BrokerContext.getInstance());
082
083 // Add the http connector to the configuration.
084 transportConnector = new ServletConnector(getConnectorURL());
085 answer.addConnector(transportConnector);
086
087 return answer;
088 }
089
090 protected String getConnectorURL() {
091 return "http://localhost/" + getServletContext().getServletContextName();
092 }
093 }