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: Main.java 155459 2005-02-26 13:24:44Z dirkv $ 009 */ 010 package org.apache.commons.messagelet; 011 012 import java.util.Iterator; 013 014 import javax.jms.JMSException; 015 import javax.servlet.ServletContext; 016 017 import org.apache.commons.logging.Log; 018 import org.apache.commons.logging.LogFactory; 019 import org.apache.commons.messagelet.model.SubscriptionDigester; 020 import org.apache.commons.messagelet.model.SubscriptionList; 021 import org.apache.commons.messenger.Messenger; 022 import org.apache.commons.messenger.MessengerManager; 023 024 /** 025 * <p><code>Main</code> is a simple command line program that will 026 * create a number of subscriptions and consume messages using just regular 027 * MDO and MessageListener classes. 028 * 029 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> 030 * @version $Revision: 155459 $ 031 */ 032 public class Main { 033 034 /** Logger */ 035 private static final Log log = LogFactory.getLog(Main.class); 036 037 /** The JMS connections */ 038 private MessengerManager manager; 039 040 /** The JMS Subscriptions */ 041 private SubscriptionList subscriptionList; 042 043 /** The URI that connections are loaded from */ 044 private String connectionsConfig = "Messenger.xml"; 045 046 /** The URI where subscriptions are loaded from */ 047 private String subscriptionsConfig = "subscriptions.xml"; 048 049 /** Should we use a stopwatch to output performance metrics */ 050 private boolean useStopWatch = false; 051 052 053 public static void main(String[] args) { 054 Main main = new Main(); 055 if ( args.length <= 0 ) { 056 System.out.println( "Usage <subscriptionConfigFile> [<connectionsConfigFile>]" ); 057 return; 058 } 059 if ( args.length > 0 ) { 060 main.setSubscriptionsConfig( args[0] ); 061 } 062 if ( args.length > 1 ) { 063 main.setConnectionsConfig( args[1] ); 064 } 065 066 try { 067 main.run(); 068 } 069 catch (Exception e) { 070 log.error( "Caught: " + e, e ); 071 } 072 } 073 074 public Main() { 075 } 076 077 078 /** 079 * Starts all the JMS connections and consumes JMS messages, 080 * passing them onto the MessageListener and Message Driven Objects 081 */ 082 public void run() throws Exception { 083 084 // force lazy construction 085 SubscriptionManager subscriber = new SubscriptionManager(); 086 subscriber.setMessengerManager( getMessengerManager() ); 087 subscriber.setSubscriptionList( createSubscriptionList() ); 088 subscriber.setServletContext( getServletContext() ); 089 090 subscriber.subscribe(); 091 092 // now lets start all the connections... 093 for (Iterator iter = manager.getMessengerNames(); iter.hasNext(); ) { 094 String name = (String) iter.next(); 095 Messenger messenger = manager.getMessenger( name ); 096 try { 097 messenger.getConnection().start(); 098 } 099 catch (JMSException e) { 100 log.error( "Caught exception trying to start messenger: " + name + ". Exception: " + e, e ); 101 } 102 } 103 104 //waitForever(); 105 } 106 107 108 public Messenger getMessenger(String name) throws JMSException { 109 return getMessengerManager().getMessenger( name ); 110 } 111 112 113 // Properties 114 //------------------------------------------------------------------------- 115 116 public String getConnectionsConfig() { 117 return connectionsConfig; 118 } 119 120 public void setConnectionsConfig(String connectionsConfig) { 121 this.connectionsConfig = connectionsConfig; 122 } 123 124 public String getSubscriptionsConfig() { 125 return subscriptionsConfig; 126 } 127 128 public void setSubscriptionsConfig(String subscriptionsConfig) { 129 this.subscriptionsConfig = subscriptionsConfig; 130 } 131 132 public MessengerManager getMessengerManager() throws JMSException { 133 if ( manager == null ) { 134 manager = createMessengerManager(); 135 MessengerManager.setInstance( manager ); 136 } 137 return manager; 138 } 139 140 public void setMessengerManager(MessengerManager manager) { 141 this.manager = manager; 142 } 143 144 // Implementation methods 145 //------------------------------------------------------------------------- 146 protected MessengerManager createMessengerManager() throws JMSException { 147 String config = connectionsConfig; 148 149 log.info( "Creating the JMS connections from the file: " + config ); 150 151 try { 152 return MessengerManager.load( config ); 153 } 154 catch (JMSException e) { 155 log.error( "Could not parse Messenger connection XML deployment document for URL: " + config, e ); 156 157 throw new JMSException( 158 "Could not parse Messenger connection XML deployment document for URL: " + config 159 + " reason: " + e 160 ); 161 } 162 } 163 164 protected SubscriptionList createSubscriptionList() throws JMSException { 165 String config = subscriptionsConfig; 166 167 log.info( "Loading the JMS subscriptions from: " + config ); 168 169 try { 170 SubscriptionDigester digester = new SubscriptionDigester(); 171 return (SubscriptionList) digester.parse( config ); 172 } 173 catch (Exception e) { 174 log.error( "Could not parse Messenger subscription XML deployment document for URL: " + config, e ); 175 176 throw new JMSException( 177 "Could not parse Messenger subscription XML deployment document for URL: " + config 178 + " reason: " + e 179 ); 180 } 181 } 182 183 protected ServletContext getServletContext() { 184 return null; 185 } 186 187 /** 188 * This method blocks the current thread indefinitely until the JVM is terminated. 189 */ 190 protected void waitForever() { 191 Object lock = new Object(); 192 synchronized (lock) { 193 while (true) { 194 try { 195 lock.wait(); 196 } 197 catch (Exception e) { 198 log.warn( "Main thread interupted: " + e, e ); 199 } 200 } 201 } 202 } 203 }