ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/componentmanager/ComponentManager.java
Revision: 1.32
Committed: Thu Mar 1 16:49:49 2001 UTC (23 years, 3 months ago) by ajm
Branch: MAIN
Changes since 1.31: +22 -17 lines
Log Message:
Fixed problems with needing attributes to pass components to the startUp() method.

File Contents

# Content
1 //---PACKAGE DECLARATION---
2 package uk.ac.ukc.iscream.componentmanager;
3
4 //---IMPORTS---
5 import java.util.*;
6 import java.io.*;
7 import uk.ac.ukc.iscream.util.*;
8
9 /**
10 * The component manager is the starting point for all
11 * server side components of the iscream system.
12 * It loads its initial system configuration from the
13 * default properties file, it then starts all the iscream
14 * components as specified in the default.properties under
15 * uk.ac.ukc.iscream.ComponentList
16 *
17 * @author $Author: ajm4 $
18 * @version $Id: ComponentManager.java,v 1.31 2001/03/01 16:36:52 ajm4 Exp $
19 */
20 public class ComponentManager {
21
22 //---FINAL ATTRIBUTES---
23
24 /**
25 * The current CVS revision of this class
26 */
27 public static final String REVISION = "$Revision: 1.31 $";
28
29 /**
30 * The toString() of this class
31 * As it won't be instatiated, this is needed.
32 * Not also that we pass a null as the class name (as we are static)
33 */
34 public static final String toString = FormatName.getName("ComponentManager", null, REVISION);
35
36 /**
37 * The default location of the properties file for the system
38 */
39 public static final String DEFAULTPROPERTIES = "./etc/default.properties";
40
41 /**
42 * The default time to wait before retrying
43 * component.
44 */
45 public static final int DEFAULT_COMPONENT_START_TIMEOUT = 5;
46
47 //---STATIC METHODS---
48
49 /**
50 * The main method which starts the components as
51 * listed in the default.properties file.
52 *
53 * @param args the command line arguments
54 */
55 public static void main(String[] args) {
56 System.out.println("--- i-scream Server Component Manager ---");
57 System.out.println("--- Starting System ---");
58
59 // get the command line args
60 String defaultProperties = DEFAULTPROPERTIES;
61 String filterName = null;
62 for(int i=0; i < args.length; i++) {
63 if(args[i].equals("-h")) {
64 usage();
65 }
66 else if(args[i].equals("-f")) {
67 i++; filterName = args[i];
68 }
69 else if(args[i].equals("-l")) {
70 i++; defaultProperties = args[i];
71 }
72 else {
73 usage();
74 }
75 }
76
77 // load the default properties file into the system properties
78 System.out.println(toString + ": initialising - using " + defaultProperties);
79 try {
80 Properties initProperties = new Properties(System.getProperties());
81 initProperties.load(new FileInputStream(new File(defaultProperties)));
82 System.setProperties(initProperties);
83 } catch (Exception e) {
84 System.err.println(toString + ": ERROR " + e.getMessage());
85 usage();
86 }
87
88 // continue to bring the system up
89 System.out.println(toString + ": coming up");
90
91 // start the ORB by initialising the ReferenceManager
92 ReferenceManager refman = ReferenceManager.getInstance();
93
94 // now the ORB is running, we need to activate our RootPOA
95 // so that we can start serving requests once servants start up
96 refman.activatePOA();
97
98 // get the list of components
99 String componentList = System.getProperty("uk.ac.ukc.iscream.ComponentList");
100 StringTokenizer st = new StringTokenizer(componentList, ";");
101 _componentsToStart = new ArrayList();
102
103 // this could be done using reflection
104 // but..well..we don't ;-p
105 while (st.hasMoreTokens()){
106 String componentName = st.nextToken();
107 Component component = null;
108
109
110 // ### This is where the list of supported components is checked! ###
111 if (componentName.equalsIgnoreCase("core")) {
112 component = new uk.ac.ukc.iscream.core.Core();
113 } else if (componentName.equalsIgnoreCase("filtermanager")) {
114 component = new uk.ac.ukc.iscream.filtermanager.FilterManager();
115 } else if (componentName.equalsIgnoreCase("rootfilter")) {
116 component = new uk.ac.ukc.iscream.rootfilter.RootFilter();
117 } else if (componentName.equalsIgnoreCase("dbinterface")) {
118 component = new uk.ac.ukc.iscream.dbinterface.DBInterface();
119 } else if (componentName.equalsIgnoreCase("clientinterface")) {
120 component = new uk.ac.ukc.iscream.clientinterface.ClientInterfaceMain();
121 // note the passing of the Filter's name in its constructor
122 } else if (componentName.equalsIgnoreCase("filter")) {
123 component = new uk.ac.ukc.iscream.filter.FilterMain(filterName);
124 } else if (componentName.equalsIgnoreCase("client")) {
125 component = new uk.ac.ukc.iscream.client.ClientMain();
126 }
127 // ### Add new component constructors in the above section! ###
128
129 // build the list of components to start
130 if (component != null) {
131 _componentsToStart.add(component);
132 } else {
133 System.err.println(toString + ": WARNING unsupported component not started");
134 }
135 }
136
137
138
139 // get the value for timeout
140
141 String confTimeout = null;
142 try {
143 confTimeout = System.getProperty("uk.ac.ukc.iscream.ComponentTimeout");
144 confTimeout.trim();
145 _startTimeout = Integer.parseInt(confTimeout);
146 } catch (NumberFormatException e) {
147 _startTimeout = DEFAULT_COMPONENT_START_TIMEOUT;
148 System.err.println(toString + ": unable to read uk.ac.ukc.iscream.ComponentTimeout value (" + confTimeout + "), using default!");
149 }
150 System.out.println(toString + ": using component start timeout of " + _startTimeout + " seconds");
151
152 // startup the system components
153 startUp();
154
155 // block on the ORB...in time, management functionality can be placed here.
156 // if we detect a CORBA communication error, we'll restart all the components.
157 while(true) {
158 try {
159 refman.getORB().run();
160 } catch (org.omg.CORBA.COMM_FAILURE e) {
161 System.out.println(toString + ": WARNING CORBA communications failure - " + e.getMessage());
162 System.out.println(toString + ": WARNING CORBA connections have been lost - attempting to restart!");
163 }
164 startUp();
165 }
166 }
167
168 /**
169 * Starts the components as obtained from the configuration.
170 * This method calls the start() methods on all the components.
171 * If a component fails to start due to a CORBA communication
172 * problem, then it catches this and tries to start it again
173 * according to uk.ac.ukc.iscream.ComponentTimeout time.
174 *
175 * If the server dies and CORBA connections are lost, this method
176 * is called again.
177 */
178 private static void startUp() {
179 // now we try and start the beast up
180 boolean tryAgain = true;
181 Component component = null;
182
183 // keep trying until we've started all the components.
184 // maybe add support for a limited number of retries
185 while(tryAgain) {
186 Iterator i = _componentsToStart.iterator();
187 ArrayList failedComponents = new ArrayList();
188 // go through all the components
189 while(i.hasNext()) {
190 try {
191 component = (Component) i.next();
192 System.out.println(toString + ": starting component - " + component.toString());
193
194 // start the component
195 component.start();
196
197 // if we get this then there was a problem
198 // that we can't recover from
199 } catch (ComponentStartException e) {
200 System.err.println(toString + ": ERROR starting component - " + component.toString());
201 System.err.println(toString + ": component reports - " + e.getMessage());
202 System.exit(1);
203
204 // if we get this exception then we've tried
205 // to talk to something which may not be up yet
206 // so we want to try again in a minute
207 } catch(ComponentCORBAException e2) {
208 System.err.println(toString + ": WARNING Component reported CORBA communications failure");
209 System.err.println(toString + ": This could be because it can't communicate with components it needs.");
210 System.err.println(toString + ": component reports - " + e2.getMessage());
211
212 // make a list of the failed components
213 failedComponents.add(component);
214 }
215 }
216
217 // if we had some failed components that we can retry
218 if (failedComponents.size() > 0) {
219 System.err.println(toString + ": WARNING One or more components failed to start correctly.");
220 System.err.println(toString + ": Will try again in " + _startTimeout + " seconds");
221
222 // our list is now the failed list
223 _componentsToStart = failedComponents;
224
225 // sleep for a given timeout
226 try {
227 Thread.sleep(_startTimeout * 1000);
228 } catch (InterruptedException e) {
229 // we're not bothered
230 }
231 // otherwise we started everything
232 } else {
233 // so we set to exit the loop
234 tryAgain = false;
235 }
236 }
237
238 System.out.println(toString + ": running");
239 }
240
241 /**
242 * A simple method to print the usage of this class.
243 * It never returns, but instead exits to the system
244 * with a value 1, to indicate the system did not start
245 * properly.
246 */
247 public static void usage() {
248 System.out.println("USAGE: java uk.ac.ukc.iscream.componentmanager.ComponentManager <option>");
249 System.out.println(" or: java -jar iscream.jar <option>");
250 System.out.println("WHERE <option>:");
251 System.out.println(" -l <filename> - the location of initial system properties");
252 System.out.println(" the default is ./etc/default.properties");
253 System.out.println(" -f <name> - the name of the filter (if there is one configured");
254 System.out.println(" -h - this help screen");
255 System.exit(1);
256 }
257
258 //---CONSTRUCTORS---
259
260 //---PUBLIC METHODS---
261
262 //---PRIVATE METHODS---
263
264 //---ACCESSOR/MUTATOR METHODS---
265
266 //---ATTRIBUTES---
267
268 //---STATIC ATTRIBUTES---
269
270 private static ArrayList _componentsToStart;
271 private static int _startTimeout = 0;
272
273 }