Update of /var/cvs/applications/crontab/src/org/mmbase/applications/crontab
In directory 
james.mmbase.org:/tmp/cvs-serv16867/src/org/mmbase/applications/crontab

Modified Files:
        CronDaemon.java CronEntry.java CronEntryField.java 
        ProposedJobs.java 
Log Message:
more MMB-1687


See also: 
http://cvs.mmbase.org/viewcvs/applications/crontab/src/org/mmbase/applications/crontab
See also: http://www.mmbase.org/jira/browse/MMB-1687


Index: CronDaemon.java
===================================================================
RCS file: 
/var/cvs/applications/crontab/src/org/mmbase/applications/crontab/CronDaemon.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- CronDaemon.java     29 Jul 2008 13:36:34 -0000      1.16
+++ CronDaemon.java     29 Jul 2008 15:21:45 -0000      1.17
@@ -20,7 +20,7 @@
  *
  * @author Kees Jongenburger
  * @author Michiel Meeuwissen
- * @version $Id: CronDaemon.java,v 1.16 2008/07/29 13:36:34 michiel Exp $
+ * @version $Id: CronDaemon.java,v 1.17 2008/07/29 15:21:45 michiel Exp $
  */
 public class CronDaemon  implements ProposedJobs.Listener {
 
@@ -47,29 +47,49 @@
 
 
     public void notify(ProposedJobs.Event event) {
+        log.debug("Received " + event);
+        if (proposedJobs != null) {
         synchronized(proposedJobs) {
+                log.debug("" + proposedJobs.size());
             Iterator<ProposedJobs.Event> i = proposedJobs.iterator();
             while (i.hasNext()) {
                 ProposedJobs.Event proposed = i.next();
                 if (event.equals(proposed)) {
+                        log.debug("Found job " + event + " already ");
                     if (proposed.getMachine().compareTo(event.getMachine()) > 
0) {
+                            log.debug("Will prefer " + proposed.getMachine());
                         event = proposed;
+                        } else {
+                            log.debug("Will prefer " + event.getMachine());
                     }
                     // remove any way, to readd later after the loop.
                     i.remove();
+                        break; //can be only one
+                    } else {
+                        log.debug("" + event + " != " + proposed);
                 }
             }
+                log.debug("Scheduling " + event);
             proposedJobs.add(event);
+                log.debug("" + proposedJobs.size());
+            }
+        } else {
+            log.service("Ignored " + event + " because we don't have jobs of 
type " + CronEntry.Type.BALANCE);
         }
     }
 
     protected void consumeJobs() {
         synchronized(proposedJobs) {
-            ProposedJobs.Event event = proposedJobs.poll();
-            while (event != null) {
+
+            for (ProposedJobs.Event event = proposedJobs.poll(); event != 
null; event = proposedJobs.poll()) {
+                log.service("Consuming " + event);
                 if (event.isLocal()) {
                     CronEntry proposed = event.getCronEntry();
                     CronEntry local = getById(cronEntries, 
event.getCronEntry().getId());
+                    if (local == null) {
+                        log.service("Ignored " + event + " because we don't 
have it.");
+                        continue;
+                    }
                     if (local.equals(proposed)) {
                         //local.setLastRun(event.getCronStart());
                         
org.mmbase.util.ThreadPools.jobsExecutor.execute(local.getExecutable());
@@ -81,6 +101,13 @@
             }
         }
     }
+    public List<ProposedJobs.Event> getQueue() {
+        if (proposedJobs != null) {
+            return new ArrayList<ProposedJobs.Event>(proposedJobs);
+        } else {
+            return Collections.emptyList();
+        }
+    }
 
     /**
      * Finds in given set the CronEntry with the given id.
@@ -113,18 +140,18 @@
         } else {
             addEntry(entry);
         }
-        if (entry.getType() == CronEntry.Type.BALANCE && proposedJobs == null) 
{
-            proposedJobs = new DelayQueue<ProposedJobs.Event>();
-            cronTimer.scheduleAtFixedRate(new TimerTask() { public void run() 
{CronDaemon.this.consumeJobs();} }, getFirst(), 60 * 1000);
         }
 
-    }
 
     /**
      * Actually adds, no checks for 'removedEntries' and so on.
      */
     protected void addEntry(CronEntry entry) {
         entry.init();
+        if (entry.getType() == CronEntry.Type.BALANCE && proposedJobs == null) 
{
+            proposedJobs = new DelayQueue<ProposedJobs.Event>();
+            cronTimer.scheduleAtFixedRate(new TimerTask() { public void run() 
{CronDaemon.this.consumeJobs();} }, getFirst(), 60 * 1000);
+        }
         cronEntries.add(entry);
         log.service("Added entry " + entry);
     }
@@ -238,7 +265,7 @@
             for (CronEntry entry : cronEntries) {
                 if (Thread.currentThread().isInterrupted()) return;
                 if (entry.mustRun(currentMinute)) {
-                    if (entry.kick()) {
+                    if (entry.kick(currentMinute)) {
                         if (log.isDebugEnabled()) {
                             log.debug("Started " + entry);
                         }


Index: CronEntry.java
===================================================================
RCS file: 
/var/cvs/applications/crontab/src/org/mmbase/applications/crontab/CronEntry.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- CronEntry.java      29 Jul 2008 13:36:34 -0000      1.13
+++ CronEntry.java      29 Jul 2008 15:21:45 -0000      1.14
@@ -19,7 +19,7 @@
  *
  * @author Kees Jongenburger
  * @author Michiel Meeuwissen
- * @version $Id: CronEntry.java,v 1.13 2008/07/29 13:36:34 michiel Exp $
+ * @version $Id: CronEntry.java,v 1.14 2008/07/29 15:21:45 michiel Exp $
  */
 
 public class CronEntry implements java.io.Serializable {
@@ -39,31 +39,32 @@
          * Since we use a thread-pool for other types of jobs now any way, it 
is doubtfull if it is
          * ever usefull to opt for this type.
          */
-        SHORT,
+        SHORT, //0
         /**
          * The default job type is the 'must be one' job. Such jobs are not 
started if the same job is
          * still running. They are wrapped in a seperate thread, so other jobs 
can be started during the
          * execution of this one.
          */
-        MUSTBEONE,
+         MUSTBEONE, //1
         /**
          * The 'can be more' type job is like a 'must be one' job, but the 
run() method of such jobs is even
          * called (when scheduled) if it itself is still running.
          */
-        CANBEMORE,
+         CANBEMORE, //2
 
         /**
          * A job of this type runs exactly once in the load balanced mmbase 
cluster. Before the job
          * is started, communication between mmbase's in the server will be 
done, to negotiate who
          * is going to do it.
          */
-         BALANCE,
+         BALANCE; //3
+
 
 
          /**
          * NOT IMPLEMENTED. As BALANCED, but no job is started as the previous 
was not yet finished.
          */
-        BALANCE_MUSTBEONE;
+            //BALANCE_MUSTBEONE;
 
 
 
@@ -182,6 +183,9 @@
     public boolean isAlive() {
         return isAlive(0);
     }
+    public boolean isMustBeOne() {
+        return type == Type.MUSTBEONE;
+    }
 
     Interruptable getExecutable() {
         final Date start = new Date();
@@ -196,7 +200,7 @@
         return thread;
     }
 
-    public boolean kick() {
+    public boolean kick(Date currentTime) {
         switch (type) {
         case SHORT:
             {
@@ -207,7 +211,8 @@
                 }
                 return true;
             }
-        case BALANCE_MUSTBEONE: {
+        case BALANCE: {
+            
org.mmbase.core.event.EventManager.getInstance().propagateEvent(new 
ProposedJobs.Event(this, currentTime));
             return true;
         }
         case MUSTBEONE:
@@ -342,8 +347,9 @@
             return false;
         }
         CronEntry other = (CronEntry)o;
+        //
         return id.equals(other.id) && name.equals(other.name) &&
-            className.equals(other.className) && 
cronTime.equals(other.cronTime) && servers.equals(other.servers)
+            className.equals(other.className) && 
cronTime.equals(other.cronTime) && 
servers.pattern().equals(other.servers.pattern())
             && (configuration == null ? other.configuration == null : 
configuration.equals(other.configuration));
     }
 


Index: CronEntryField.java
===================================================================
RCS file: 
/var/cvs/applications/crontab/src/org/mmbase/applications/crontab/CronEntryField.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- CronEntryField.java 2 Jan 2006 22:01:39 -0000       1.2
+++ CronEntryField.java 29 Jul 2008 15:21:45 -0000      1.3
@@ -14,10 +14,10 @@
  * One the fields of the 'crontab' syntax, which is something like '*' or '* 
/5' or 5-23. See 'man 5 crontab'
  *
  * @author Kees Jongenburger
- * @version $Id: CronEntryField.java,v 1.2 2006/01/02 22:01:39 michiel Exp $
+ * @version $Id: CronEntryField.java,v 1.3 2008/07/29 15:21:45 michiel Exp $
  */
 
-public class CronEntryField {
+public class CronEntryField implements java.io.Serializable {
     private String content;
 
     boolean[] valid = new boolean[60];


Index: ProposedJobs.java
===================================================================
RCS file: 
/var/cvs/applications/crontab/src/org/mmbase/applications/crontab/ProposedJobs.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ProposedJobs.java   29 Jul 2008 13:36:34 -0000      1.1
+++ ProposedJobs.java   29 Jul 2008 15:21:45 -0000      1.2
@@ -14,13 +14,17 @@
 import java.util.Date;
 import java.util.concurrent.*;
 
+import org.mmbase.util.logging.*;
+
 /**
 
  * @author Michiel Meeuwissen
- * @version $Id: ProposedJobs.java,v 1.1 2008/07/29 13:36:34 michiel Exp $
+ * @version $Id: ProposedJobs.java,v 1.2 2008/07/29 15:21:45 michiel Exp $
  */
 
 public class ProposedJobs {
+    private static final Logger log = 
Logging.getLoggerInstance(ProposedJobs.class);
+
 
     public static int TYPE_PROPOSE = 100;
     public static int TYPE_DONE    = 101;
@@ -31,12 +35,12 @@
 
         protected final CronEntry entry;
         protected final Date cronStart;
-        protected final long maxDuration;
+        //protected final long maxDuration;
 
-        public Event(CronEntry entry, Date s, long duration) {
+        public Event(CronEntry entry, Date s) { //, long duration) {
             this.entry = entry;
             this.cronStart = s;
-            this.maxDuration = duration;
+            //this.maxDuration = duration;
         };
         public CronEntry getCronEntry() {
             return entry;
@@ -44,17 +48,20 @@
         public Date getCronStart() {
             return cronStart;
         }
+        /*
         public long getMaxDuration() {
             return maxDuration;
         }
+        */
 
         public boolean equals(Object o) {
             if (o instanceof Event) {
                 Event other = (Event) o;
                 return
                     other.getCronEntry().equals(entry) &&
-                    other.getCronStart() == cronStart;
+                    other.getCronStart().equals(cronStart);
             } else {
+                log.debug("no");
                 return false;
             }
         }
@@ -73,6 +80,10 @@
 
         }
 
+        public String toString() {
+            return getMachine() + ":" + cronStart + ":" + entry;
+        }
+
     }
 
 
_______________________________________________
Cvs mailing list
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to