in src/main/java/org/apache/sling/event/impl/jobs/queues/JobQueueImpl.java [254:310]
public void startJobs() {
if ( this.startJobsGuard.compareAndSet(false, true) ) {
// we start as many jobs in parallel as possible
while ( this.running && !this.isOutdated.get() && !this.isSuspended() && this.available.tryAcquire() ) {
boolean started = false;
this.lock.writeLock().lock();
try {
final JobHandler handler = this.cache.getNextJob(this.services.jobConsumerManager,
this.services.statisticsManager, this, this.doFullCacheSearch.getAndSet(false));
if ( handler != null ) {
started = true;
this.threadPool.execute(new Runnable() {
@Override
public void run() {
// update thread priority and name
final Thread currentThread = Thread.currentThread();
final String oldName = currentThread.getName();
final int oldPriority = currentThread.getPriority();
currentThread.setName(oldName + "-" + handler.getJob().getQueueName() + "(" + handler.getJob().getTopic() + ")");
if ( configuration.getThreadPriority() != null ) {
switch ( configuration.getThreadPriority() ) {
case NORM : currentThread.setPriority(Thread.NORM_PRIORITY);
break;
case MIN : currentThread.setPriority(Thread.MIN_PRIORITY);
break;
case MAX : currentThread.setPriority(Thread.MAX_PRIORITY);
break;
}
}
try {
startJob(handler);
} finally {
currentThread.setPriority(oldPriority);
currentThread.setName(oldName);
}
// and try to launch another job
startJobs();
}
});
} else {
// no job available, stop look
break;
}
} finally {
if ( !started ) {
this.available.release();
}
this.lock.writeLock().unlock();
}
}
this.startJobsGuard.set(false);
}
}