@Override
 public ScheduleToken schedule(Instant triggerDateTime, Object event) {
   Assert.state(initialized, () -> "Scheduler is not yet initialized");
   EventMessage eventMessage = GenericEventMessage.asEventMessage(event);
   String jobIdentifier = JOB_NAME_PREFIX + eventMessage.getIdentifier();
   QuartzScheduleToken tr = new QuartzScheduleToken(jobIdentifier, groupIdentifier);
   try {
     JobDetail jobDetail =
         buildJobDetail(eventMessage, new JobKey(jobIdentifier, groupIdentifier));
     scheduler.scheduleJob(jobDetail, buildTrigger(triggerDateTime, jobDetail.getKey()));
   } catch (SchedulerException e) {
     throw new SchedulingException("An error occurred while setting a timer for a saga", e);
   }
   return tr;
 }
 /**
  * Builds the JobDetail instance for Quartz, which defines the Job that needs to be executed when
  * the trigger fires.
  *
  * <p>The resulting JobDetail must be identified by the given {@code jobKey} and represent a Job
  * that dispatches the given {@code event}.
  *
  * <p>This method may be safely overridden to change behavior. Defaults to a JobDetail to fire a
  * {@link FireEventJob}.
  *
  * @param event The event to be scheduled for dispatch
  * @param jobKey The key of the Job to schedule
  * @return a JobDetail describing the Job to be executed
  */
 protected JobDetail buildJobDetail(EventMessage event, JobKey jobKey) {
   JobDataMap jobData = jobDataBinder.toJobData(event);
   return JobBuilder.newJob(FireEventJob.class)
       .withDescription(event.getPayloadType().getName())
       .withIdentity(jobKey)
       .usingJobData(jobData)
       .build();
 }