@Override
public synchronized boolean schedule(String name, Runnable fn, Map<ScheduleOption, Object> opts) throws Exception {
Options<ScheduleOption> options = new Options<>(opts);
validateOptions(options);
start();
final boolean replacedExisting = unschedule(name);
final JobDataMap jobDataMap = new JobDataMap();
final Map contextOptions = new HashMap();
contextOptions.put(ExecutionContext.CreateOption.SINGLETON, options.getBoolean(SINGLETON));
final ImmediateContext context = WunderBoss.findOrCreateComponent(ImmediateContext.class, name, contextOptions);
context.setAction(fn);
jobDataMap.put(RunnableJob.RUN_FUNCTION_KEY, context);
JobBuilder jobBuilder;
if (options.getBoolean(ALLOW_CONCURRENT_EXEC)) {
jobBuilder = JobBuilder.newJob(RunnableJob.class);
} else {
jobBuilder = JobBuilder.newJob(RunnableJob.NotConcurrentlyExecuting.class);
}
JobDetail job = jobBuilder.usingJobData(jobDataMap).build();
this.scheduler.scheduleJob(job, initTrigger(name, options));
this.currentJobs.put(name, job.getKey());
return replacedExisting;
}