[jboss-svn-commits] JBL Code SVN: r8239 - labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Dec 11 15:05:29 EST 2006


Author: estebanschifman
Date: 2006-12-11 15:05:25 -0500 (Mon, 11 Dec 2006)
New Revision: 8239

Modified:
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerController.java
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerControllerFactory.java
Log:
Avoid unnecessary parameter reloading, and relaunching of child threads (ESB aware)

Modified: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerController.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerController.java	2006-12-11 19:24:08 UTC (rev 8238)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerController.java	2006-12-11 20:05:25 UTC (rev 8239)
@@ -121,7 +121,7 @@
 	 * 
 	 * @return boolean - true if it's time to reload parameters
 	 */
-	public abstract boolean timeToReload();
+	public abstract boolean isReloadNeeded();
 
 	/**
 	 * Helper accessor for child processes that provides info to determine if

Modified: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerControllerFactory.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerControllerFactory.java	2006-12-11 19:24:08 UTC (rev 8238)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/listeners/message/EsbListenerControllerFactory.java	2006-12-11 20:05:25 UTC (rev 8239)
@@ -60,8 +60,10 @@
  */
 public abstract class EsbListenerControllerFactory 
 {
-	private static Map<String,String> _paramFileTimeStamps=new ConcurrentHashMap<String,String>();
+	private static Map<String,Long> _paramFileTimeStamps=new ConcurrentHashMap<String,Long>();
 	private static String _sRldSecs=null;
+	private static String _parametersName;
+
 	/**
 	 * Create an instance of EsbListenerController from a named configuration stored in the
 	 * paramater repository.
@@ -71,6 +73,7 @@
 	 */
 	public static EsbListenerController getInstance(String parameterName) throws Exception {
 		EsbListenerControllerImpl controller =  new EsbListenerControllerImpl(parameterName);
+		_parametersName = parameterName;
 		return startController(controller);
 	}
 	
@@ -136,6 +139,7 @@
 			System.exit(oS.getCompletionCode());
 		} // ________________________________
 	
+		private Object _synchReload = new Short((short)0);
 		protected int m_iDfltReloadMillis = 180000 // default interval between
 													// parameter reloads
 		;
@@ -241,25 +245,26 @@
 		/* (non-Javadoc)
 		 * @see org.jboss.soa.esb.listeners.message.EsbListenerController#checkParms(org.jboss.soa.esb.helpers.ConfigTree)
 		 */
-		public void checkParms(ConfigTree p_oP) throws Exception {
+		public void checkParms(ConfigTree p_oP) throws Exception 
+		{
 			// We've just loaded - set to false until next reload requested
 			m_bReloadRequested = false;
+			if (null!=_parametersName)
+			{
+				File file = new File(_parametersName);
+				if (file.exists())
+					_paramFileTimeStamps.put(_parametersName, file.lastModified());
+			}
+			
+
 			commandQueue = createCommandQueue(p_oP);
 	
 			// Open the command queue...
 			if (null!=commandQueue)
 				commandQueue.open(p_oP);
 	
-			// if PARM_RELOAD_SECS not set, and no command queue
-			// then reload every 10 minutes
-			// If there is a command queue, run until command is received
-			_sRldSecs = p_oP.getAttribute(PARM_RELOAD_SECS);
-			m_lNextReload = (null != _sRldSecs) 
-					? System.currentTimeMillis() + 1000 * Long.parseLong(_sRldSecs)
-					: (null == commandQueue) 
-							? Long.MAX_VALUE 
-							: System.currentTimeMillis() + m_iDfltReloadMillis;
-	
+			setNextReloadTime(p_oP);
+
 			// if PARM_END_TIME not set try to run forever
 			// not a good practice if command queue is not set
 			// Expected date format is "yyyyMMdd hh:mm:ss"
@@ -269,6 +274,33 @@
 	          
 		} // ________________________________
 	
+		private void setNextReloadTime(ConfigTree tree)
+		{
+			// if RELOAD_SECONDS_TAG not set, and no command queue
+			// then reload every 10 minutes
+			// If there is a command queue, run until command is received
+
+			_sRldSecs = tree.getAttribute(EsbListenerController.PARM_RELOAD_SECS);
+			synchronized (_synchReload) 
+			{
+				m_lNextReload = (null != _sRldSecs) 
+				? System.currentTimeMillis() + 1000 * Long.parseLong(_sRldSecs)
+				: (null == commandQueue) 
+						? Long.MAX_VALUE 
+						: System.currentTimeMillis() + m_iDfltReloadMillis;
+			}
+			
+			
+		    if (null==_sRldSecs)
+		    {
+		    	String sMsg = (null==commandQueue)
+		    		? " -  Using default of "+_sRldSecs
+		    		: " - Listener will run until stopped by command sent to queue";
+		    	_logger.warn("No value specified for: "+EsbListenerController.PARM_RELOAD_SECS + sMsg);
+		    }
+
+		} //________________________________
+
 	    /**
 	     * Factory method for creating the command queue.
 	     * @param config EsbListenerControllerImpl config.
@@ -299,15 +331,20 @@
 		/* (non-Javadoc)
 		 * @see org.jboss.soa.esb.listeners.message.EsbListenerController#run()
 		 */
-		public void run() {
-			while (endNotRequested()) {
+		public void run() 
+		{
+			boolean relaunch = true;
+			while (endNotRequested()) 
+			{
 				m_oState = State.Running;
-				for (ConfigTree oCurr : m_oParms.getAllChildren()) {
-					String sClass = oCurr.getAttribute(PARM_LISTENER_CLASS);
-					if (Util.isNullString(sClass))
-						continue;
-					tryToLaunchChildListener(oCurr, sClass);
-				}
+				if (relaunch)
+					for (ConfigTree oCurr : m_oParms.getAllChildren()) 
+					{
+						String sClass = oCurr.getAttribute(PARM_LISTENER_CLASS);
+						if (Util.isNullString(sClass))
+							continue;
+						tryToLaunchChildListener(oCurr, sClass);
+					}
 				m_oState = State.Ready;
 	
 				waitForCmdOrSleep();
@@ -315,37 +352,24 @@
 				if (endRequested()) {
 					break;
 				}
-				if (m_sParmsName != null && timeToReload()) {
-					//check the TS on the file.
-					boolean reloadNeeded=true;
-					File paramFile = new File(m_sParmsName);
-					if (paramFile.exists()) {
-						String currentTimeStamp = String.valueOf(paramFile.lastModified());
-						String previousTimeStamp = _paramFileTimeStamps.get(m_sParmsName);
-						_paramFileTimeStamps.put(m_sParmsName, currentTimeStamp);
-						if (previousTimeStamp!=null && previousTimeStamp.equals(currentTimeStamp)) {
-							reloadNeeded=false;
-							m_lNextReload = (null != _sRldSecs) 
-							? System.currentTimeMillis() + 1000 * Long.parseLong(_sRldSecs)
-							: (null == commandQueue) 
-									? Long.MAX_VALUE 
-									: System.currentTimeMillis() + m_iDfltReloadMillis;
-						}
+
+				relaunch = false;
+				if (m_sParmsName != null && isReloadNeeded()) 
+					try 
+					{
+						m_oState = State.Loading_parameters;
+						_logger
+								.info("Reloading parameters _____________________________________________________");
+						ConfigTree oNew = EsbListenerControllerImpl.getListenerConfig(m_sParmsName);
+						checkParms(oNew);
+						m_oParms = oNew;
+						relaunch = true;
+					} 
+					catch (Exception e) 
+					{
+						_logger.error("Failed to reload parameters"
+								+ " - Continuing with cached version", e);
 					}
-					if (reloadNeeded) {
-						try {
-							m_oState = State.Loading_parameters;
-							_logger
-									.info("Reloading parameters _____________________________________________________");
-							ConfigTree oNew = EsbListenerControllerImpl.getListenerConfig(m_sParmsName);
-							checkParms(oNew);
-							m_oParms = oNew;
-						} catch (Exception e) {
-							_logger.error("Failed to reload parameters"
-									+ " - Continuing with cached version", e);
-						}
-					}
-				}
 			}
 			// m_oState = State.Shutting_down;
 	
@@ -379,8 +403,12 @@
 			}
 		} // ________________________________
 	
-		public long millisToWait() {
-			return Math.min(m_lNextReload, m_lEndTime) - System.currentTimeMillis();
+		public long millisToWait()
+		{
+			synchronized (_synchReload)
+			{
+				return Math.min(m_lNextReload, m_lEndTime) - System.currentTimeMillis();
+			}
 		} // ________________________________
 	
 		private void waitForCmdOrSleep() {
@@ -411,7 +439,7 @@
 						return;
 					}
 					processCommand(oM);
-					if (endRequested() || timeToReload()) {
+					if (endRequested() || isReloadNeeded()) {
 						break;
 					}
 				} catch (CommandQueueException eJ) {
@@ -505,19 +533,49 @@
 			return !endRequested();
 		}
 	
-		/* (non-Javadoc)
-		 * @see org.jboss.soa.esb.listeners.message.EsbListenerController#timeToReload()
-		 */
-		public boolean timeToReload() {
-			return m_bReloadRequested
-					|| System.currentTimeMillis() >= m_lNextReload;
+		public boolean isReloadNeeded()
+		{
+			// command to reload was received - force reload
+			if (m_bReloadRequested)
+				return refreshNextReload();
+
+			// Still not time to reload
+			if (System.currentTimeMillis() < m_lNextReload)
+				return false;
+			
+			if (null==_parametersName)
+				return refreshNextReload();
+			
+			File paramFile = new File(_parametersName);
+			if (! paramFile.exists())
+				return refreshNextReload();
+			
+//			check the TS on the file.
+			Long previousTimeStamp	= _paramFileTimeStamps.get(_parametersName);
+			if (null==previousTimeStamp)
+				return refreshNextReload();
+
+
+			Long currentTimeStamp	= paramFile.lastModified();
+			if (! previousTimeStamp.equals(currentTimeStamp))
+				return refreshNextReload();
+
+			setNextReloadTime(m_oParms);
+			return false;
 		}
+		
+		private boolean refreshNextReload()
+		{
+			setNextReloadTime(m_oParms);
+			return true;
+		}
+
 	
 		/* (non-Javadoc)
 		 * @see org.jboss.soa.esb.listeners.message.EsbListenerController#continueLooping()
 		 */
 		public boolean continueLooping() {
-			return (endNotRequested() && !timeToReload());
+			return (endNotRequested() && !isReloadNeeded());
 		} // ________________________________
 		
 		public static EPRManager getEprManager()




More information about the jboss-svn-commits mailing list