public void execute(final JobExecutionContext context)
throws JobExecutionException {
final JobDataMap data = context.getJobDetail().getJobDataMap();
data.put(QuartzJobScheduler.DATA_MAP_JOB_EXECUTION_CONTEXT, context);
final Logger logger = (Logger)data.get(QuartzJobScheduler.DATA_MAP_LOGGER);
final String name = (String)data.get(QuartzJobScheduler.DATA_MAP_NAME);
final Boolean canRunConcurrentlyB = ((Boolean)data.get(QuartzJobScheduler.DATA_MAP_RUN_CONCURRENT));
final boolean canRunConcurrently = ((canRunConcurrentlyB == null) ? true : canRunConcurrentlyB.booleanValue());
if (!canRunConcurrently) {
Boolean isRunning = (Boolean)data.get(DATA_MAP_KEY_ISRUNNING);
if ((null != isRunning) && isRunning.booleanValue()) {
logger.warn("Cron job name '" + name +
" already running but configured to not allow concurrent runs. Will discard this scheduled run");
return;
}
}
if (logger.isInfoEnabled()) {
logger.info("Scheduling cron job named '" + name + "'");
}
Object job = null;
String jobrole = null;
ServiceManager manager = (ServiceManager)data.get(QuartzJobScheduler.DATA_MAP_MANAGER);
org.apache.cocoon.environment.Context envContext =
(org.apache.cocoon.environment.Context)data.get(QuartzJobScheduler.DATA_MAP_ENV_CONTEXT);
BackgroundEnvironment env;
try {
env = new BackgroundEnvironment(logger, envContext, manager);
} catch (MalformedURLException mue) {
// Unlikely to happen
throw new JobExecutionException(mue);
}
CocoonComponentManager.enterEnvironment(env, env.getManager(), env.getProcessor());
boolean release = false;
try {
jobrole = (String)data.get(QuartzJobScheduler.DATA_MAP_ROLE);
if (null == jobrole) {
job = data.get(QuartzJobScheduler.DATA_MAP_OBJECT);
} else {
job = manager.lookup(jobrole);
release = true;
}
if (job instanceof ConfigurableCronJob) {
final Parameters params = (Parameters)data.get(QuartzJobScheduler.DATA_MAP_PARAMETERS);
final Map objects = (Map)data.get(QuartzJobScheduler.DATA_MAP_OBJECTMAP);
((ConfigurableCronJob)job).setup(params, objects);
}
data.put(DATA_MAP_KEY_ISRUNNING, Boolean.TRUE);
if (job instanceof Job) {
((Job)job).execute(context);
} else if (job instanceof CronJob) {
((CronJob)job).execute(name);
} else if (job instanceof Runnable) {
((Runnable)job).run();
} else {
logger.error("job named '" + name + "' is of invalid class: " + job.getClass().getName());
}
} catch (final Throwable t) {
logger.error("Cron job name '" + name + " died.", t);
if (t instanceof JobExecutionException) {
throw (JobExecutionException)t;
}
} finally {