# Task Scheduling

# Introduction

ExpressWebJs task scheduler helps you manage scheduled tasks on your server. It allows you to define your command schedule within your application. When using the scheduler, only a single cron entry is needed on your server. Your task schedule is defined in the App/Console/Kernel.ts file’s schedule method.

# Define Schedules

The schedule method in the App/Console/Kernel.ts class. Let’s take a look at the closure scheduler example which makes use of scheduler call method. Within the closure, we will just console.log a string.

import scheduler from "expressweb-scheduler-ts";

class Kernel{
    /**
     * The Maker commands provided by your application.
     *
     * @var array
     */
    static commands () {
        return[
            //
        ]
    };

    /**
     * Define the application's command schedule.
     *
     * @return void
     */
    static schedule()
    {
        scheduler.call(()=> {
            console.log(‘running a closure scheduler’)
        }).daily().run();
    }
}

# Scheduling Maker Commands

In addition to scheduling closures, you may also schedule Maker commands. You can do this by using the scheduler command method to schedule a Maker command using the command’s name(signature) while adding the imported command object in the commands method

import scheduler from "expressweb-scheduler-ts";
import SendEmails from "./Commands/SendEmails_command";

class Kernel {
  /**
   * The Maker commands provided by your application.
   * @var array
   */
  static commands() {
    return [SendEmails];
  }

    /**
     * Define the application's command schedule.
     *
     * @return void
     */
    static schedule()
    {
        scheduler.command(‘sendMail’).daily().run();
    }
}

# Schedule Frequency Options

We've taken time to review few ways on how you may configure a task to run at specified intervals. However, there are many more task schedule frequencies that you may assign to a task: Check below for fields and values for cron methods and other available methods.

Allowed fields in cron method

# ┌────────────── second (optional)
# │ ┌──────────── minute
# │ │ ┌────────── hour
# │ │ │ ┌──────── day of month
# │ │ │ │ ┌────── month
# │ │ │ │ │ ┌──── day of week
# │ │ │ │ │ │
# │ │ │ │ │ │
# * * * * * *
Field Value
->second 0-59
->minute 0-59
->hour 0-23
->day of month 1-12 (or names)
->month 1-12 (or names)
->day of week 0-7 (or names, 0 or 7 are sunday)

Method Description
->cron('* * * * *'); Run the task on a custom cron schedule
->everyMinute(); Run the task every minute
->everyTwoMinutes(); Run the task every two minutes
->everyThreeMinutes(); Run the task every three minutes
->everyFourMinutes(); Run the task every four minutes
->everyFiveMinutes(); Run the task every five minutes
->everyTenMinutes(); Run the task every ten minutes
->everyFifteenMinutes(); Run the task every fifteen minutes
->everyThirtyMinutes(); Run the task every thirty minutes
->hourly(); Run the task every hour
->hourlyAt(17); Run the task every hour at 17 minutes past the hour
->everyTwoHours(); Run the task every two hours
->everyThreeHours(); Run the task every three hours
->everyFourHours(); Run the task every four hours
->everySixHours(); Run the task every six hours
->daily(); Run the task every day at midnight
->dailyAt('13:00'); Run the task every day at 13:00
->twiceDaily(1, 13); Run the task daily at 1:00 & 13:00
->weekly(); Run the task every Sunday at 00:00
->weeklyOn(1, '8:00'); Run the task every week on Monday at 8:00
->monthly(); Run the task on the first day of every month at 00:00
->monthlyOn(4, '15:00'); Run the task every month on the 4th at 15:00
->twiceMonthly(1, 16, '13:00'); Run the task monthly on the 1st and 16th at 13:00
->lastDayOfMonth('15:00'); Run the task on the last day of the month at 15:00
->quarterly(); Run the task on the first day of every quarter at 00:00
->yearly(); Run the task on the first day of every year at 00:00
->yearlyOn(6, 1, '17:00'); Run the task every year on June 1st at 17:00
->timezone('America/New_York'); Set the timezone for the task

These methods may be combined with additional constraints to create even more finely tuned schedules that only run on certain days of the week. For example, you may schedule a command to run weekly on Monday:

// Run once per week on Monday ...
scheduler
  .call(() => {
    //
  })
  .weekly()
  .mondays()
  .run();

// Run hourly on weekdays...
scheduler.command("foo").weekdays().hourly().run();

# Day Constraints

The days method may be used to limit the execution of a task to specific days of the week. For example, you may schedule a command to run hourly on Sundays and Wednesdays:

scheduler.command("SendEmail").hourly().days([0, 3]).run();

# Truth Test Constraints

The when method may be used to limit the execution of a task based on the result of a given truth test. In other words, if the given closure returns true, the task will execute as long as no other constraining conditions prevent the task from running:

scheduler
  .command("SendEmail")
  .daily()
  .when(() => {
    return true;
  })
  .run();

# Running The Scheduler

Now that we have learned how to define scheduled tasks, let's discuss how to actually run them on our server. The run-schedule Maker command will evaluate all of your scheduled tasks and determine if they need to run based on the server's current time.

 ts-node maker run-schedule