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:

  1. CronJobResult: Result of execution
  2. 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

SAP Hybris Cronjob Overview

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:

  1. Create all individual jobs
  2. Add all that jobs in CompositeEntry

INSERT_UPDATE CompositeEntry; code[unique=true]; executableCronJob(code)
;entry1;solrIndexerCronJob
;entry2;productExportCronJob
;entry3;cleanupCronJob
  1. 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:

  1. 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())
}
"
  1. Scripting job: this contain reference to defined script using scriptURI

INSERT_UPDATE ScriptingJob; code[unique=true];scriptURI;
;removeTestUserJob;model://removeTestUserScript;
  1. 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

Leave a Reply

Your email address will not be published. Required fields are marked *