Author: michiel
Date: 2010-05-03 11:39:48 +0200 (Mon, 03 May 2010)
New Revision: 42080
Modified:
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
Log:
it's better to only synchronize on final variables
Modified:
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
===================================================================
---
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
2010-05-03 09:06:58 UTC (rev 42079)
+++
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
2010-05-03 09:39:48 UTC (rev 42080)
@@ -30,12 +30,13 @@
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 ScheduledFuture proposedFuture;
private ScheduledFuture failedFuture;
private ScheduledFuture future;
@@ -45,9 +46,6 @@
* 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();
}
@@ -126,7 +124,6 @@
protected void consumeJobs() {
synchronized(proposedJobs) {
-
for (ProposedJobs.Event event = proposedJobs.poll(); event !=
null; event = proposedJobs.poll()) {
if (event.isLocal()) {
log.service("Consuming " + event + " locally");
@@ -214,27 +211,28 @@
*/
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() {
- @Override
- public void run() {
- CronDaemon.this.consumeJobs();
- }
- }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
- ThreadPools.identify(proposedFuture, "Crontab's poposed balanced
job consumer");
+ synchronized(cronEntries) {
+ if ((entry.getType() == CronEntry.Type.BALANCE || entry.getType()
== CronEntry.Type.BALANCE_MUSTBEONE)
+ && proposedFuture == null) {
+ 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");
+ }
+ if (failedFuture == null) {
+ 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)");
+ }
+ cronEntries.add(entry);
}
- if (failedFuture == null) {
- 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)");
- }
- cronEntries.add(entry);
log.service("Added entry " + entry);
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs