001 /*
002 * Copyright (C) The Apache Software Foundation. All rights reserved.
003 *
004 * This software is published under the terms of the Apache Software License
005 * version 1.1, a copy of which has been included with this distribution in
006 * the LICENSE file.
007 *
008 * $Id: ManagerServlet.java 155459 2005-02-26 13:24:44Z dirkv $
009 */
010 package org.apache.commons.messagelet;
011
012 import java.net.URL;
013 import java.util.Iterator;
014
015 import javax.jms.JMSException;
016 import javax.servlet.GenericServlet;
017 import javax.servlet.ServletException;
018 import javax.servlet.ServletRequest;
019 import javax.servlet.ServletResponse;
020
021 import org.apache.commons.messagelet.model.SubscriptionDigester;
022 import org.apache.commons.messagelet.model.SubscriptionList;
023 import org.apache.commons.messenger.Messenger;
024 import org.apache.commons.messenger.MessengerManager;
025
026 /** <p><code>ManagerServlet</code> manages the
027 * initialisation and destruction of the Messenger connections
028 * and use of MessageListener beans for a given ServletContext.</p>
029 *
030 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
031 * @version $Revision: 155459 $
032 */
033 public class ManagerServlet extends GenericServlet {
034
035 /** Should HTTP servlets be used or generic servlets. If true then JSP can be dispatched to easily */
036 private static final boolean USE_HTTP_SERVLETS = true;
037
038 private static final String KEY_CONNECTIONS = "connections";
039 private static final String KEY_SUBSCRIPTIONS = "subscriptions";
040
041 /**
042 * Whether exceptions occurring during subscriptions on startup should
043 * terminate the initialization
044 */
045 private boolean continueOnSubscribeException;
046
047 public ManagerServlet() {
048 }
049
050 public SubscriptionManager getSubscriptionManager() {
051 SubscriptionManager answer = (SubscriptionManager) getServletContext().getAttribute( "subscriptionManager" );
052 if (answer == null) {
053 answer = new SubscriptionManager();
054 getServletContext().setAttribute( "subscriptionManager", answer );
055 }
056 return answer;
057 }
058
059 // Servlet methods
060 //-------------------------------------------------------------------------
061
062 public synchronized void init() throws ServletException {
063 String text = getServletContext().getInitParameter( "continueOnSubscribeException" );
064 if ( text != null && text.equals( "true" ) ) {
065 continueOnSubscribeException = true;
066 }
067
068 // ensure Messenger is initialised
069 try {
070 SubscriptionManager subscriber = getSubscriptionManager();
071 MessengerManager manager = subscriber.getMessengerManager();
072 if ( manager == null ) {
073 manager = createMessengerManager();
074
075 subscriber.setMessengerManager( manager );
076 subscriber.setSubscriptionList( createSubscriptionList() );
077 subscriber.setServletContext( getServletContext() );
078
079 // load the subscriptions....
080 subscriber.subscribe();
081
082 // now lets start all the connections...
083 for (Iterator iter = manager.getMessengerNames(); iter.hasNext(); ) {
084 String name = (String) iter.next();
085 Messenger messenger = manager.getMessenger( name );
086 try {
087 messenger.getConnection().start();
088 }
089 catch (JMSException e) {
090 log( "Caught exception trying to start messenger: " + name + ". Exception: " + e, e );
091 }
092 }
093 }
094 }
095 catch (JMSException e) {
096 throw new ServletException("Failed to initialize: " + e, e );
097 }
098 }
099
100 public void destroy() {
101 try {
102 getSubscriptionManager().unsubscribe();
103 }
104 catch (Exception e) {
105 log( "Failed to destrory the MBOs: " + e, e );
106 }
107
108 try {
109 MessengerManager manager = getSubscriptionManager().getMessengerManager();
110 if ( manager != null ) {
111 log( "Closing the Messenger connections" );
112 manager.close();
113 }
114 }
115 catch (Exception e) {
116 log( "Failed to close the Messenger Manager: " + e, e );
117 }
118 getSubscriptionManager().setMessengerManager( null );
119 }
120
121 public void service(ServletRequest request, ServletResponse response) throws ServletException {
122 }
123
124
125 // Properties
126 //-------------------------------------------------------------------------
127 public boolean isContinueOnSubscriptionException() {
128 return continueOnSubscribeException;
129 }
130
131 /**
132 * Sets whether exceptions occurring during subscriptions on startup should
133 * terminate the initialization
134 */
135 public void setContinueOnSubscribeException(boolean continueOnSubscribeException) {
136 this.continueOnSubscribeException = continueOnSubscribeException;
137 }
138
139
140 // Implementation methods
141 //-------------------------------------------------------------------------
142 protected MessengerManager createMessengerManager() throws ServletException {
143 String config = getURLResource( KEY_CONNECTIONS, "The Messenger connections XML deployment document" );
144
145 log( "Creating the Messenger connections from the file: " + config );
146
147 try {
148 return MessengerManager.load( config );
149 }
150 catch (JMSException e) {
151 log( "Could not parse Messenger connection XML deployment document for URL: " + config, e );
152
153 throw new ServletException(
154 "Could not parse Messenger connection XML deployment document for URL: " + config
155 + " reason: " + e, e
156 );
157 }
158 }
159
160 protected SubscriptionList createSubscriptionList() throws ServletException {
161 String config = getURLResource( KEY_SUBSCRIPTIONS, "The Messenger subscriptions XML deployment document" );
162
163 log( "Loading the Messenger subscriptions from: " + config );
164
165 try {
166 SubscriptionDigester digester = new SubscriptionDigester();
167 return (SubscriptionList) digester.parse( config );
168 }
169 catch (Exception e) {
170 log( "Could not parse Messenger subscription XML deployment document for URL: " + config, e );
171
172 throw new ServletException(
173 "Could not parse Messenger subscription XML deployment document for URL: " + config
174 + " reason: " + e, e
175 );
176 }
177 }
178
179 protected String getURLResource(String key, String description) throws ServletException {
180 String config = getInitParameter( key );
181 if ( config == null || config.length() == 0 ) {
182 throw new ServletException(
183 "No initialization parameter for parameter: " + key
184 + " description: " + description
185 );
186 }
187 try {
188 URL url = getServletContext().getResource( config );
189 config = url.toString();
190 }
191 catch (Exception e) {
192 // ignore, must be an absolute URL
193 }
194 return config;
195 }
196
197 /**
198 * Allows derived servlets to handle JMS exceptions differently, such as ignoring certain kinds of
199 * exceptions or performing custom logging etc.
200 */
201 protected void handleJMSException(String message, JMSException exception) throws ServletException {
202 log( message, exception );
203
204 if ( ! isContinueOnSubscriptionException() ) {
205 throw new ServletException( message, exception );
206 }
207 }
208 }