ramc 01/03/15 09:10:07 Modified: src/java/org/apache/cornerstone/blocks/scheduler DefaultTimeScheduler.xinfo DefaultTimeScheduler.java Log: Patch for TimeScheduler block. This should fix the problem with timeout when the trigger is rescheduled. Revision Changes Path 1.2 +1 -0 jakarta-avalon-cornerstone/src/java/org/apache/cornerstone/blocks/scheduler/DefaultTimeScheduler.xinfo Index: DefaultTimeScheduler.xinfo =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/cornerstone/blocks/scheduler/DefaultTimeScheduler.xinfo,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultTimeScheduler.xinfo 2001/02/22 07:52:16 1.1 +++ DefaultTimeScheduler.xinfo 2001/03/15 17:10:01 1.2 @@ -6,6 +6,7 @@ <contributors> <author name="Peter Donald" email="[EMAIL PROTECTED]"/> + <patcher name="Ram Chidambaram" email="[EMAIL PROTECTED]"/> </contributors> </meta> 1.2 +37 -9 jakarta-avalon-cornerstone/src/java/org/apache/cornerstone/blocks/scheduler/DefaultTimeScheduler.java Index: DefaultTimeScheduler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/cornerstone/blocks/scheduler/DefaultTimeScheduler.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultTimeScheduler.java 2001/02/22 07:52:16 1.1 +++ DefaultTimeScheduler.java 2001/03/15 17:10:03 1.2 @@ -24,6 +24,7 @@ * Default implementation of TimeScheduler service. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Ram Chidambaram</a> */ public class DefaultTimeScheduler extends AbstractLoggable @@ -86,6 +87,7 @@ //use the kill-o-matic against any entry with same name final TimeScheduledEntry entry = getEntry( name ); entry.invalidate(); + m_entries.remove( name ); } /** @@ -109,16 +111,30 @@ * @param timeEntry the entry * @param clone true if new entry is to be created */ - protected void rescheduleEntry( final TimeScheduledEntry timeEntry, final boolean clone ) + protected void rescheduleEntry( final TimeScheduledEntry timeEntry, + final boolean clone ) { TimeScheduledEntry entry = timeEntry; if( clone ) { - entry = new TimeScheduledEntry( timeEntry.getName(), - timeEntry.getTimeTrigger(), - timeEntry.getTarget() ); - timeEntry.invalidate(); + try + { + entry = new TimeScheduledEntry( timeEntry.getName(), + timeEntry.getTimeTrigger().getClone(), + timeEntry.getTarget() ); + timeEntry.invalidate(); + + // remove old refernce to the entry..so that next time + // somebody calls getEntry( name ), we will get the new valid entry. + m_entries.remove( timeEntry.getName() ); + m_entries.put( timeEntry.getName(), entry ); + } + catch( final CloneNotSupportedException cnse ) + { + //not sure what to do with this.... + //but this should never happen as interface TimeTrigger is Cloneable. + } } //reschedule if appropriate @@ -191,8 +207,22 @@ if( !m_priorityQueue.isEmpty() ) { - final TimeScheduledEntry entry = + TimeScheduledEntry entry = (TimeScheduledEntry)m_priorityQueue.peek(); + + //if job has been invalidated then remove it and continue + while( !entry.isValid() ) + { + m_priorityQueue.pop(); + + if ( m_priorityQueue.isEmpty() ) break; + + entry = (TimeScheduledEntry)m_priorityQueue.peek(); + } + + if ( m_priorityQueue.isEmpty() ) + continue; + duration = entry.getNextTime() - System.currentTimeMillis(); if( 0 == duration ) @@ -209,9 +239,6 @@ //and run it m_priorityQueue.pop(); - //if job has been invalidated then remove it and continue - if( !entry.isValid() ) continue; - runEntry( entry ); rescheduleEntry( entry, false ); @@ -224,6 +251,7 @@ //top of heap try { synchronized( m_monitor ) { m_monitor.wait( duration ); } } catch( final InterruptedException ie ) { } + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]