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
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/componentmanager/ComponentManager.java (file contents):
Revision 1.17 by ajm, Fri Feb 23 16:36:38 2001 UTC vs.
Revision 1.27 by ajm, Fri Feb 23 18:02:33 2001 UTC

# Line 38 | Line 38 | public class ComponentManager {
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      /**
# Line 92 | Line 98 | public class ComponentManager {
98          // get the list of components
99          String componentList = System.getProperty("uk.ac.ukc.iscream.ComponentList");
100          StringTokenizer st = new StringTokenizer(componentList, ";");
95        
96
101          ArrayList componentsToStart = new ArrayList();
102          
103          // this could be done using reflection
# Line 120 | Line 124 | public class ComponentManager {
124              }
125              // ###  Add new component constructors in the above section! ###
126              
127 +            // build the list of components to start
128              if (component != null) {
129                  componentsToStart.add(component);    
130              } else {
# Line 127 | Line 132 | public class ComponentManager {
132              }
133          }
134          
135 +        // now we try and start the beast up        
136          boolean tryAgain = true;
137          Component component = null;
138 +
139 +        // get the value for timeout
140 +        int startTimeout;
141 +        String confTimeout;
142 +        try {
143 +            confTimeout = System.getProperty("uk.ac.ukc.iscream.ComponentTimeout");
144 +            startTimeout = Integer.parseInt(confTimeout);
145 +        } catch (NumberFormatException e) {
146 +            startTimeout = DEFAULT_COMPONENT_START_TIMEOUT;
147 +            System.err.println(toString + ": unable to read uk.ac.ukc.iscream.ComponentTimeout value (" + confTimeout + "), using default!");
148 +        }
149 +        System.out.println(toString + ": using component start timeout of " + startTimeout + " seconds");
150 +        
151 +        // keep trying until we've started all the components.
152 +        // maybe add support for a limited number of retries
153          while(tryAgain) {
154              Iterator i = componentsToStart.iterator();
155 +            ArrayList failedComponents = new ArrayList();
156 +            // go through all the components
157              while(i.hasNext()) {
158                  try {
159                      component = (Component) i.next();
160                      System.out.println(toString + ": starting component - " + component.toString());
161 +                    
162 +                    // start the component
163                      component.start();
164 <                    componentsToStart.remove(componentsToStart.indexOf(component));
164 >                    
165 >                // if we get this then there was a problem
166 >                // that we can't recover from
167                  } catch (ComponentStartException e) {
168                      System.err.println(toString + ": ERROR starting component - " + component.toString());
169                      System.err.println(toString + ": component reports - " + e.getMessage());
170                      System.exit(1);
171 +
172 +                // if we get this exception then we've tried
173 +                // to talk to something which may not be up yet
174 +                // so we want to try again in a minute                
175                  } catch(ComponentCORBAException e2) {
176                      System.err.println(toString + ": WARNING Component reported CORBA communications failure");
177                      System.err.println(toString + ": This could be because it can't communicate with components it needs.");
178                      System.err.println(toString + ": component reports - " + e2.getMessage());
179 +                    
180 +                    // make a list of the failed components
181 +                    failedComponents.add(component);
182                  }
183              }
184 <            if (componentsToStart.size() > 0) {
184 >            
185 >            // if we had some failed components that we can retry
186 >            if (failedComponents.size() > 0) {
187                  System.err.println(toString + ": WARNING One or more components failed to start correctly.");
188 <                System.err.println(toString + ": Will try again in 5 seconds");
189 <                Thread.sleep(5000);
190 <            } else {
191 <                try {
192 <                    tryAgain = false;
188 >                System.err.println(toString + ": Will try again in " + startTimeout + " seconds");
189 >            
190 >                // our list is now the failed list
191 >                componentsToStart = failedComponents;
192 >                
193 >                // sleep for a given timeout
194 >                try {    
195 >                    Thread.sleep(startTimeout * 1000);
196                  } catch (InterruptedException e) {
197                      // we're not bothered
198                  }
199 +            // otherwise we started everything
200 +            } else {
201 +                // so we set to exit the loop
202 +                tryAgain = false;
203              }
204          }
205                  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines