Dynamic Cron Job / Cron job scripting
If you need basic idea of Cron job, Please go through below link
Cron job overview
We all know that creating cron job is time consuming as it involves multiple steps
Example : We need to create java class, define spring bean,build and restart server etc.
But through dynamic scripting, Cron jobs can be created with very minimal steps and more importantly we don’t need to build and restart server.
Yes It allows the creation of cronjobs dynamically at run time.
Before jumping on how it can be achieved, lets understand below jargons
Script : It is an item type(corresponding table) called Script created by Hybris to store the script content
Script content can be written in any of the supported dynamic languages like “Groovy”
Scripting Job : It is also an item type called ScriptingJob created by Hybris to store new Service layer Job item,
This contains the reference to defined Script using ScriptURI
ScriptingJobPerformable : This is the actual Java class created by Hybris which contains the Perform method
This java class is responsible for executing scripted cronjob logic
Whenever the cronjob is triggered,The execution will be delegated to the ScriptingJobPerfomable class.
Lets see how we define Dynamic Scripting Jobs
Step 1
Define the Script as below
- INSERT_UPDATE Script; code[unique=true];content
- ;myFirstDynamicScript;println 'Welcome to Dynamic Scripting Job! '+ new Date()
INSERT_UPDATE Script; code[unique=true];content ;myFirstDynamicScript;println 'Welcome to Dynamic Scripting Job! '+ new Date()
code: Represents the unique code within that type
Content : Content above is a groovy script to just print Welcome message with Today’s date
This can be a complex logic based on the requirement
Example : Deletion of few rows in some table.
Run the above impex in HAC, this will store the script in DB
Step 2
Define the Scripting Job as below
- INSERT_UPDATE ScriptingJob; code[unique=true];scriptURI
- ;myFirstDynamicScriptJob;model://myFirstDynamicScript
INSERT_UPDATE ScriptingJob; code[unique=true];scriptURI ;myFirstDynamicScriptJob;model://myFirstDynamicScript
code : Represents the unique code within that type
scriptURI : This will point to the location of Script
In our case, we stored Script in DB, we refer it using model://referenceToScript
Run the above impex in HAC, this will store the Scripting Job along with reference to Script in DB
Step 3
Define the Cronjob
This step is similar to traditional way of defining cron job
- INSERT_UPDATE CronJob; code[unique=true];job(code);singleExecutable;sessionLanguage(isocode)
- ;myFirstDynamicScriptCronJob;myFirstDynamicScriptJob;true;en
INSERT_UPDATE CronJob; code[unique=true];job(code);singleExecutable;sessionLanguage(isocode) ;myFirstDynamicScriptCronJob;myFirstDynamicScriptJob;true;en
code: Represents the unique code within that type
job(code) : Holds the reference to the above defined job(in Step 2)
Step 4
Executing the CronJob
We will define Groovy script to execute the cron job as below
- def dynamicCJ = cronJobService.getCronJob("myFirstDynamicScriptCronJob")
- cronJobService.performCronJob(dynamicCJ,true)
def dynamicCJ = cronJobService.getCronJob("myFirstDynamicScriptCronJob") cronJobService.performCronJob(dynamicCJ,true)
Go to the scripting languages console in HAC,select Groovy as scripting language, Run the above script in Commit mode
Step 5
If you want to schedule the cron job instead of running it at directly,then we can avoid Step 4 and can be scheduled using Trigger as below
- INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression
- ;myFirstDynamicScriptCronJob; 0 0 * ? * * *
INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression ;myFirstDynamicScriptCronJob; 0 0 * ? * * *
Now above trigger defines the schedule to run the cron job for every one hour
Output of the defined scron job is very simple, it just prints Welcome message with Current date
Note : It is possible to define much complex logic instead of just Welcome message in the real time requirements.
Limitation:
One of the main limitations of this approach is that, since script content is stored as column value in DB,we can not store large chunk of content due to column length limit in DB