Clowder supports scheduling of repetitive tasks by executing a job registered in MongoDB
. The only implemented job as of August 2016 is
EmailDigest triggered by setting an e-mail option in user's profile page as seen in Figure below. Selecting hourly, daily or monthly option in the pull down menu creates a job called
Digest('userId') in the database which is then executed at pre-defined times, currently at the top of an hour (hourly), at 7:00 am (daily) or every Monday at 7:00 am (weekly).
jobTimer in the Clowder calls
JobsScheduler.runScheduledJobs() every minute. This is done from
This time is then split into
day_of_month variables in the
app/models/JobsScheduler.scala) for further use in the code and for jobs’ execution and maintenance.
The time variables are compared with a set of integers stored in every job object in the MongoDB Collection (
jobs). In other words the time comparison is done by integer equality. A job gets fired hourly when
minute=minutejob if no other values of
day_of_month are defined. Similarly, the job gets executed with minutes and hours set (daily) when
hour=hourjob (no other values of
day_of_month are defined) etc. Note that there is no verification of time inserted in the system, nor there is time/date object comparison.
A job model in Clowder is called
app/models/TimerJob.scala). A programmer can create different job schema but the
TimerJob is sufficient for the most repetitive tasks.
A full time, or only subset of it is set in the
day_of_week (1-7 for Monday-Sunday) and
day_of_month (1-31) precision. An option
frequency is meant to be ‘hourly’, ‘daily’, ‘weekly’, ‘monthly’ but can be any descriptive string. The
lastJobTime field is useful for getting the time interval since the last job call (set by
parameters can be used for any object id,
function is a string describing action (e.g.
Creating and calling a new timer job
Create and update job
TimerJobjob is created and set in the MongoDB
Collectionby newly coded functions in
app/services/mongoldb/MongoDBSchedulerService.scalacalled for example
This is similar to a function
updateEmailJob()already implemented in the Clowder where
updateJobTime(name, Option(0), Option(7), Option(1), Option(setting))refers tot the time set to minute=0, hour=7 and day_of_week=1 (Monday) in the database as mentioned above. When Clowder time matches the values the job is returned from the database and Action is fired.
You can either change time directly in the code or pass the time values from a Play template as additional parameters such as:
from the Play
requestor directly in Scala on the server side call your job update:
scheduler.updateMyJob(id, name, setting)
idis a parameters id (
parameters: Option[UUID], see
nameis the job's name and
settingsare used to distinguish time frequency (from options of pull down menus for example - hourly, weekly etc.)
Call and get job
app/models/JobsScheduler.scalato get your job (
TimerJob) at a certain time
and register it with
Create a new class
myAction.scalafor example in a package
models/Event.scalaas an example)
ObjectServiceabove, for example called
UserServicein the case of sending email digest and the user id was used as a parameter in the
TimerJoband MongoDB job objects.
day_of_month variable is part of the
TimerJob model but it is not used in the
Adding it is straightforward:
add extra parameter (
models/Event.scalafor sending email digests) by commenting it out. Your events (followed objects for example) will become 'permanent' and the timer job will always execute since there is no update of the
lastJobTimevariable in the MongoDB job object. Don't forget to enable the
updateLastRun()when you are done debugging.
Set the time variables in
getJobByTime() in app/services/mongoldb/MongoDBSchedulerService.scalato those saved in the MongoDB job object. The job action will fire every minute since the integer equality is always true. For example for the pre-defined e-mail times (
Again, don't forget to reverse changes when you are done debugging.
Testing e-mail digest
Add functioning e-mail in
app/util/Mail.scalaif you use a 'fake' e-mail in your local Clowder developmental branch
securesocial.confor override it by setting
Note that the host above can be used only within the NCSA's network.