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]

Reply via email to