1 21 22 package org.opensubsystems.patterns.backgroundtask.www; 23 24 import java.util.ArrayList ; 25 import java.util.HashMap ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.util.Map ; 29 import java.util.Properties ; 30 import java.util.Timer ; 31 import java.util.logging.Level ; 32 import java.util.logging.Logger ; 33 34 import javax.servlet.ServletContextEvent ; 35 import javax.servlet.ServletContextListener ; 36 37 import org.opensubsystems.core.error.OSSException; 38 import org.opensubsystems.core.util.Config; 39 import org.opensubsystems.core.util.DateUtils; 40 import org.opensubsystems.core.util.Log; 41 import org.opensubsystems.patterns.backgroundtask.util.BackgroundTask; 42 43 56 public abstract class BackgroundTaskListener implements ServletContextListener 57 { 58 60 64 protected Map m_tasks; 65 66 70 protected Map m_tasksTimers; 71 72 74 77 private static Logger s_logger = Log.getInstance(BackgroundTaskListener.class); 78 79 81 84 public BackgroundTaskListener() 85 { 86 super(); 87 } 88 89 92 public void contextInitialized( 93 ServletContextEvent servletContextEvent 94 ) 95 { 96 s_logger.entering(this.getClass().getName(), "contextInitialized"); 97 try 98 { 99 BackgroundTask currentTask = null; 100 Timer currentTimer = null; 101 List receiverIDs = new ArrayList (); 102 Properties settings; 103 String receiverIdValue; 104 StringBuffer sbTaskIdentifier = new StringBuffer (); 105 int iDefaultTaskIdentifierLength; 106 107 settings = Config.getInstance().getPropertiesSafely(); 108 109 sbTaskIdentifier.append(getBaseProperty()); 110 sbTaskIdentifier.append("."); 111 iDefaultTaskIdentifierLength = sbTaskIdentifier.length(); 112 for (int id = 0;; id++) 113 { 114 sbTaskIdentifier.delete(iDefaultTaskIdentifierLength, 116 sbTaskIdentifier.length()); 117 sbTaskIdentifier.append(id); 118 receiverIdValue = settings.getProperty(sbTaskIdentifier.toString(), 120 "id_not_found"); 121 if (receiverIdValue.equals("id_not_found")) 123 { 124 break; 125 } 126 if (Config.isTrue(receiverIdValue)) 127 { 128 receiverIDs.add(new Integer (id)); 130 } 131 } 132 133 m_tasks = new HashMap (receiverIDs.size()); 134 m_tasksTimers = new HashMap (receiverIDs.size()); 135 136 Iterator tasksIterator = receiverIDs.iterator(); 137 Integer taskID; 138 139 while (tasksIterator.hasNext()) 140 { 141 try 142 { 143 taskID = (Integer )tasksIterator.next(); 144 145 currentTask = createTask(taskID.intValue()); 146 currentTimer = new Timer (true); 147 m_tasks.put(taskID, currentTask); 148 m_tasksTimers.put(taskID, currentTimer); 149 150 currentTimer.schedule( 154 currentTask, 155 currentTask.getStartDelay() * DateUtils.ONE_SECOND, 156 (long) (currentTask.getRunEvery() * DateUtils.ONE_SECOND)); 157 } 158 catch (Throwable thr) 159 { 160 s_logger.log(Level.SEVERE, 161 "Problem while creating background task", thr); 162 } 163 } 164 } 165 catch (Throwable thr) 168 { 169 s_logger.log(Level.SEVERE, "Unexpected exception.", thr); 171 throw new RuntimeException ("Unexpected exception.", thr); 172 } 173 finally 174 { 175 s_logger.exiting(this.getClass().getName(), "contextInitialized"); 176 } 177 } 178 179 182 public void contextDestroyed( 183 ServletContextEvent servletContextEvent 184 ) 185 { 186 s_logger.entering(this.getClass().getName(), "contextDestroyed"); 187 try 188 { 189 if (m_tasksTimers != null) 190 { 191 Iterator timersIterator = m_tasksTimers.entrySet().iterator(); 192 Timer currentTaskTimer; 193 Integer currentTaskID; 194 BackgroundTask currentTask; 195 Map.Entry currentEntry; 196 197 while (timersIterator.hasNext()) 198 { 199 currentEntry = (Map.Entry )timersIterator.next(); 200 currentTaskID = (Integer )currentEntry.getKey(); 201 currentTaskTimer = (Timer )currentEntry.getValue(); 202 currentTaskTimer.cancel(); 204 currentTask = (BackgroundTask)m_tasks.get(currentTaskID); 206 currentTask.cancel(); 207 } 208 } 209 } 210 finally 211 { 212 s_logger.exiting(this.getClass().getName(), "contextDestroyed"); 213 } 214 } 215 216 224 protected abstract BackgroundTask createTask( 225 int iId 226 ) throws OSSException; 227 228 235 protected abstract String getBaseProperty( 238 ); 239 } 240 | Popular Tags |