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