uafrica/delayed-jobs

A CakePHP Plugin to manage and process background jobs with priority and retries

Installs: 31 720

Dependents: 0

Suggesters: 0

Stars: 8

Watchers: 11

Forks: 1

Open Issues: 2

Type:cakephp-plugin


README

This delayed Jobs module was built by Jaco Roux for the uAfrica eCommerce Platform.

A plugin that allows you to load priority tasks for async processing. This is a scalable plugin that can be executed on multiple application servers to distribute the load. It uses a combination of a database and a RabbitMQ server to manage the job queue.

Requirements

Installation

  1. Require the plugin with composer $ composer require uafrica/delayed-jobs.
  2. Load the plugin by running bin/cake plugin load DelayedJobs
  3. Setup the database by running bin/cake migrations migrate --plugin DelayedJobs

Running a worker

To run a single worker, run bin/cake worker -v. To run multiple workers, run bin/cake watchdog --workers x (Where x is the number to run)

It is recommended to use something like SupervisorD to run multiple workers.

Enqueuing a job

    $job = new \DelayedJob\DelayedJob\Job();
    $job->setWorker('RunJob') //References a \App\Worker\RunJobWorker class
        ->setPayload($payload) //An array of payload data 
        ->setRunAt(new Time('+1 hour')) //Run this job in an hour
        ->setPriority('10'); //Priority of 10

    \DelayedJob\DelayedJob\JobManager::instance()
        ->enqueue($job);

Alternatively, you can use the \DelayedJob\DelayedJob\EnqueueTrait which gives an enqeue($worker, $payload, $options) method.

Creating a worker

Simply create a class in the Worker namespace that implements the \DelayedJob\Worker\JobWorkerInterface

For example

namespace DelayedJobs\Worker;

use DelayedJobs\DelayedJob\Job;
use DelayedJobs\Result\Success;

/**
 * Class TestWorker
 */
class TestWorker implements JobWorkerInterface
{
    /**
     * @param \DelayedJobs\DelayedJob\Job $job The job that is being run.
     * @return bool
     */
    public function __invoke(Job $job)
    {
        return new Success('We ran!')
    }
}