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 org.activemq.broker.BrokerContainer;
021 import org.activemq.broker.impl.BrokerContainerImpl;
022 import org.activemq.transport.TransportChannelListener;
023 import org.activemq.transport.TransportServerChannelSupport;
024
025 import javax.jms.JMSException;
026 import javax.servlet.ServletException;
027
028 /**
029 * This servlet embeds an ActiveMQ broker inside a servlet engine which is
030 * ideal for deploying ActiveMQ inside a WAR and using this servlet as a HTTP tunnel.
031 *
032 * @version $Revision$
033 */
034 public class HttpEmbeddedTunnelServlet extends HttpTunnelServlet {
035
036 private BrokerContainer broker;
037 private ServletConnector transportConnector;
038
039 public synchronized void init() throws ServletException {
040 // lets initialize the ActiveMQ broker
041 if (broker == null) {
042 broker = createBroker();
043 }
044 try {
045 broker.start();
046 }
047 catch (JMSException e) {
048 throw new ServletException("Failed to start embedded broker: " + e, e);
049 }
050 // now lets register the listener
051 TransportChannelListener listener = transportConnector.getTransportChannelListener();
052 getServletContext().setAttribute("transportChannelListener", listener);
053 super.init();
054 }
055
056 protected static class ServletConnector extends TransportServerChannelSupport {
057 public ServletConnector(String url) {
058 super(url);
059 }
060 }
061
062 /**
063 * Factory method to create a new broker
064 */
065 protected BrokerContainer createBroker() {
066 BrokerContainer answer = new BrokerContainerImpl();
067 String url = getConnectorURL();
068 transportConnector = new ServletConnector(url);
069 answer.addConnector(transportConnector);
070
071 String brokerURL = getServletContext().getInitParameter("org.activemq.brokerURL");
072 if (brokerURL != null) {
073 log("Listening for internal communication on: " + brokerURL);
074 }
075 return answer;
076 }
077
078 protected String getConnectorURL() {
079 return "http://localhost/" + getServletContext().getServletContextName();
080 }
081 }