[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