You can use something like this. Some of it may have changed in latest version but this was working fine few years ago on a previous version.
Identity requestor = context.getObject(Identity.class, launcher);
Identity identity = context.getObject(Identity.class, identityName);
// Create new Scheduler
CertificationScheduler scheduler = new CertificationScheduler(context);
// Create Schedule and set run now to true to launch the certification immediately
CertificationSchedule schedule = scheduler.initializeScheduleBean(requestor, Certification.Type.Identity);
schedule.setRunNow(true);
CertificationDefinition definition = schedule.getDefinition();
//Use all the methods applicable for your case available for CertificationDefinition in order to set configurations
definition.setName("Movers Certification for : " + identity.getDisplayableName() + " [" + new Date().toString() + "]");
Identity certGroupOwner = context.getObjectByName(Identity.class, "spadmin");
definition.setCertificationOwner(certGroupOwner);
definition.setRequireReassignmentCompletion(true);
definition.setCertifierSelectionType(CertificationDefinition.CertifierSelectionType.Manual);
if(userManager != null && !userManager.isEmpty()){
definition.setCertifierName(userManager);
log.debug("UserManager");
} else {
definition.setCertifierName("spadmin");
}
List identities = new ArrayList();
identities.add(identityName);
definition.setIdentitiesToCertify(identities);
definition.setIncludePolicyViolations(true);
Integer activePeriodDurationAmount = 14;
Date today = new Date();
log.debug(" The certification period is 14 days");
definition.setActivePeriodDurationAmount(activePeriodDurationAmount.longValue());
definition.setActivePeriodDurationScale(Duration.Scale.Day);
//..... set other configurations like reminder , escalation using available methods
// Schedule task to run, passing in schedule (which has certification definition attached)
TaskSchedule taskSchedule = scheduler.saveSchedule(schedule, false);