Author: michiel
Date: 2010-05-03 12:20:49 +0200 (Mon, 03 May 2010)
New Revision: 42081

Modified:
   
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
   
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronEntry.java
Log:
simplified stuff with proposed jobs a bit (consumer is simply started always)

Modified: 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
       2010-05-03 09:39:48 UTC (rev 42080)
+++ 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
       2010-05-03 10:20:49 UTC (rev 42081)
@@ -30,60 +30,57 @@
     private static final Logger log = 
Logging.getLoggerInstance(CronDaemon.class);
 
     private static CronDaemon cronDaemon;
-    private Set<CronEntry> cronEntries;
-    private Set<CronEntry> removedCronEntries;
-    private Set<CronEntry> addedCronEntries;
+    private final Set<CronEntry> cronEntries        = 
Collections.synchronizedSet(new LinkedHashSet<CronEntry>()); // predictable 
order
+    private final Set<CronEntry> removedCronEntries = 
Collections.synchronizedSet(new HashSet<CronEntry>());
+    private final Set<CronEntry> addedCronEntries   = 
Collections.synchronizedSet(new LinkedHashSet<CronEntry>()); // predictable  
order
 
-    private DelayQueue<ProposedJobs.Event> proposedJobs = null;
+    private final DelayQueue<ProposedJobs.Event> proposedJobs = new 
DelayQueue<ProposedJobs.Event>();
+    private final DelayQueue<RunningCronEntry>   runningJobs  = new 
DelayQueue<RunningCronEntry>();
 
+
+
     private ScheduledFuture proposedFuture;
     private ScheduledFuture failedFuture;
     private ScheduledFuture future;
-    private final DelayQueue<RunningCronEntry> runningJobs = new 
DelayQueue<RunningCronEntry>();
 
     /**
      * CronDaemon is a Singleton. This makes the one instance and starts the 
Thread.
      */
     private CronDaemon() {
-        cronEntries = Collections.synchronizedSet(new 
LinkedHashSet<CronEntry>()); // predictable order
-        removedCronEntries = Collections.synchronizedSet(new 
HashSet<CronEntry>());
-        addedCronEntries = Collections.synchronizedSet(new 
LinkedHashSet<CronEntry>()); // predictable  order
         EventManager.getInstance().addEventListener(this);
         start();
     }
 
 
+    //@Override
     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
+        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("" + event + " != " + proposed);
+                        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);
+            log.debug("Scheduling " + event);
+            proposedJobs.add(event);
+            log.debug("" + proposedJobs.size());
         }
     }
+    //@Override
     public void notify(Events.Event event) {
         synchronized(runningJobs) {
             switch (event.getType()) {
@@ -122,9 +119,11 @@
     }
 
 
+    /**
+     * Consumes received job proposals
+     */
     protected void consumeJobs() {
         synchronized(proposedJobs) {
-
             for (ProposedJobs.Event event = proposedJobs.poll(); event != 
null; event = proposedJobs.poll()) {
                 if (event.isLocal()) {
                     log.service("Consuming " + event + " locally");
@@ -151,12 +150,8 @@
     }
 
     public List<ProposedJobs.Event> getQueue() {
-        if (proposedJobs != null) {
-            synchronized(proposedJobs) {
-                return new ArrayList<ProposedJobs.Event>(proposedJobs);
-            }
-        } else {
-            return Collections.emptyList();
+        synchronized(proposedJobs) {
+            return new ArrayList<ProposedJobs.Event>(proposedJobs);
         }
     }
     public List<RunningCronEntry> getRunning() {
@@ -166,10 +161,12 @@
     }
 
     protected void detectFailedJobs() {
+        /*
         synchronized(runningJobs) {
             for (RunningCronEntry running = runningJobs.poll(); running != 
null; running = runningJobs.poll()) {
             }
         }
+        */
     }
 
 
@@ -212,17 +209,9 @@
      */
     protected void addEntry(CronEntry entry) {
         entry.init();
-        if ((entry.getType() == CronEntry.Type.BALANCE || entry.getType() == 
CronEntry.Type.BALANCE_MUSTBEONE)
-             && proposedJobs == null) {
-            proposedJobs = new DelayQueue<ProposedJobs.Event>();
-            proposedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() { public void run() {CronDaemon.this.consumeJobs();} }, getFirst(), 
60 * 1000, TimeUnit.MILLISECONDS);
-            ThreadPools.identify(proposedFuture, "Crontab's poposed balanced 
job consumer");
+        synchronized(cronEntries) {
+            cronEntries.add(entry);
         }
-        if (failedFuture == null) {
-            failedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() { public void run() {CronDaemon.this.detectFailedJobs();} }, 
getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
-            ThreadPools.identify(failedFuture, "Crontab's failed job detector 
(unfinished)");
-        }
-        cronEntries.add(entry);
         log.service("Added entry " + entry);
     }
 
@@ -270,8 +259,30 @@
         log.info("Starting CronDaemon");
         long first = getFirst();
         log.debug("First run at " + first);
-        future = ThreadPools.scheduler.scheduleAtFixedRate(new Runnable() { 
public void run() {CronDaemon.this.run();} }, first, 60 * 1000, 
TimeUnit.MILLISECONDS);
+        future = ThreadPools.scheduler.scheduleAtFixedRate(new Runnable() {
+                //@Override
+                public void run() {
+                    CronDaemon.this.run();
+                }
+            }, first, 60 * 1000, TimeUnit.MILLISECONDS);
         ThreadPools.identify(future, "Crontab's job kicker");
+
+        proposedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
+                //@Override
+                public void run() {
+                    CronDaemon.this.consumeJobs();
+                }
+            }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
+        ThreadPools.identify(proposedFuture, "Crontab's poposed balanced job 
consumer");
+
+        failedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
+                //@Override
+                public void run() {
+                    CronDaemon.this.detectFailedJobs();
+                }
+            }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
+        ThreadPools.identify(failedFuture, "Crontab's failed job detector 
(unfinished)");
+
     }
 
     /**
@@ -376,6 +387,7 @@
         return Collections.unmodifiableSet(cronEntries);
     }
 
+    @Override
     public String toString() {
         return "MMBase Cron Daemon";
     }
@@ -399,9 +411,7 @@
         d.add(new CronEntry("1", "*/2 5-23 * * *", "every 2 minute from 5 till 
11 pm", "org.mmbase.applications.crontab.TestCronJob", null));
         //d.add(new CronEntry("40-45,50-59 * * * *","test 
40-45,50-60","Dummy",null));
 
-        try {
-            Thread.sleep(240 * 1000 * 60);
-        } catch (Exception e) {};
+        Thread.sleep(240 * 1000 * 60);
         d.stop();
     }
 }

Modified: 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronEntry.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronEntry.java
        2010-05-03 09:39:48 UTC (rev 42080)
+++ 
mmbase/branches/MMBase-1_9/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronEntry.java
        2010-05-03 10:20:49 UTC (rev 42081)
@@ -399,12 +399,13 @@
         result = HashCodeUtil.hashCode(result, name);
         result = HashCodeUtil.hashCode(result, className);
         result = HashCodeUtil.hashCode(result, cronTime);
+        result = HashCodeUtil.hashCode(result, configuration);
         return result;
     }
 
 
     /**
-     * Two CronEntrys as considered equal if they have the same id, name, 
classname and configuration.
+     * Two CronEntrys as considered equal if they have the same id, name, 
classname, cronTime and configuration.
      */
     @Override
     public boolean equals(Object o) {

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to