SAP Commerce Cronjob Overview
What is Cronjob
CronJob is a background activity that runs automatically or manually to execute some business logic at a scheduled time or interval, without user interaction. It is mainly used for long-running, repetitive, or system-level tasks. Example: Product / catalog synchronization, Order cleanup, Price & stock import, Indexing (Solr), Sending emails, Data cleanup.
Elements of Cronjob:
- Cronjob: contains additional configuration and runtime information(how to execute)
- Job: contains business logic for what to execute(what to execute)
- Trigger: create trigger to run job at a particular time(when to execute)
Steps to create custom Cronjob:
STEP 1: Create new itemtype which extends out of the box CronjobModel in *items.xml. To know how to create itemtype , refer itemtype.
<itemtypes>
<itemtype code="DeactivateProductCronJob"
extends="CronJob"
autocreate="true"
generate="true">
<attributes>
<attribute qualifier="thresholdStock" type="java.lang.Integer">
<modifiers optional="true"/>
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
</itemtypes>
STEP 2: Build and update the system. After build, DeactivateProductCronJobModel.java file created.
STEP 3: Create java class which extends “AbstractJobPerformable” or implements “JobPerformable” and override perform() method
public class DeactivateProductJob extends AbstractJobPerformable<DeactivateProductCronJobModel>
{
@Override
public PerformResult perform(DeactivateProductCronJobModel cronJob)
{
Integer threshold = cronJob.getThresholdStock();
System.out.println("Running product deactivation job");
System.out.println("Threshold Stock: " + threshold);
return new PerformResult(CronJobResult.SUCCESS, CronJobStatus.FINISHED);
}
}
perform() method return PerformResult. PerformResult contains 2 things:
- CronJobResult: Result of execution
- CronJobStatus: Current status of job
STEP 4: Define this job class bean in *spring.xml
<bean id="deactivateProductJobPerformable"
class="com.training.core.job.DeactivateProductJob"/>
STEP 5: Create an entry for this job in ServiceLayerJob
Use the same spring bean id which you have created in last step.
INSERT_UPDATE ServicelayerJob;code[unique=true];springId
;deactivateProductJob;deactivateProductJobPerformable
STEP 6: Map job with CronjobModel.
Map your job with the same model which you used in job class
INSERT_UPDATE DeactivateProductCronJob; code[unique=true]; job(code); thresholdStock
;deactivateProductCronJob;deactivateProductJob;0
STEP 7: Schedule cronjob using trigger. This step is optional
INSERT_UPDATE Trigger;cronJob(code)[unique=true];cronExpression
;deactivateProductCronJob;0 0/10 * * * ?
0 0/10 * * * ? : this cronExpression means job will run after every 10 mins

How to make Job Abortable
To make job abortable, override the isAboratble() method and use clearAbortRequestedIfNeeded() method to handle this request
Composite Cronjobs
Developers use a Composite CronJobs to execute jobs sequentially when those jobs depend on each other.
Steps to create CompositeCronjob:
- Create all individual jobs
- Add all that jobs in CompositeEntry
INSERT_UPDATE CompositeEntry; code[unique=true]; executableCronJob(code)
;entry1;solrIndexerCronJob
;entry2;productExportCronJob
;entry3;cleanupCronJob
- Add composite entries in CompositeCronjob model
INSERT_UPDATE CompositeCronJob ;code[unique=true]; job(code); compositeEntries(code); sessionUser(uid)[default=admin]; sessionLanguage(isocode)[default=en] ;customCompositeCronJob;compositeJobPerformable;entry1, entry2, entry3
Scriping/ Dynamic Cronjobs
Using Dynamic CronJobs makes cronjobs creation easier. As a result, cronjobs can be created during runtime.
Steps to create Scripting cronjob:
- Script: the itemtype where script is stored
INSERT_UPDATE Script; code[unique=true];content
;removeTestUserScript ;"import de.hybris.platform.servicelayer.search.FlexibleSearchService
import de.hybris.platform.servicelayer.search.SearchResult
import de.hybris.platform.core.model.user.UserModel
import de.hybris.platform.servicelayer.model.ModelService
def query = 'SELECT {PK} FROM {User} WHERE {name}=\'test\''
final SearchResult<UserModel> searchResult = flexibleSearchService.search(query)
if(searchResult.getResult().stream().findFirst().isPresent())
{
modelService.remove(searchResult.getResult().stream().findFirst().get())
}
"
- Scripting job: this contain reference to defined script using scriptURI
INSERT_UPDATE ScriptingJob; code[unique=true];scriptURI;
;removeTestUserJob;model://removeTestUserScript;
- Cronjob: create instance of cronjobModel and attach scripting job to it
INSERT_UPDATE CronJob;code[unique=true];job(code)[default=removeTestUserJob];sessionLanguage(isoCode)[default=en]
;removeTestUserCronJob
