mcfedr/periodic-queue-driver-bundle

This package is abandoned and no longer maintained. The author suggests using the mcfedr/queue-manager-bundle package instead.

A bundle for running symfony background tasks with doctrine as the driver

Installs: 9 559

Dependents: 0

Suggesters: 0

Security: 0

Stars: 1

Watchers: 2

Forks: 1

Open Issues: 0

Type:symfony-bundle

1.5.0 2018-10-11 06:17 UTC

This package is auto-updated.

Last update: 2022-02-01 13:05:26 UTC


README

A driver for Queue Manager Bundle that uses runs jobs periodically.

This driver doesn't run jobs, it requires another driver to actually process jobs.

Latest Stable Version License Build Status

Usage

There is no runner daemon for this driver as it just plugs into other drivers. Use it by putting jobs into this driver with the period option.

Install

Composer

composer require mcfedr/periodic-queue-driver-bundle

AppKernel

Include the bundle in your AppKernel

public function registerBundles()
{
    $bundles = [
        ...
        new Mcfedr\QueueManagerBundle\McfedrQueueManagerBundle(),
        new Mcfedr\PeriodicQueueDriverBundle\McfedrPeriodicQueueDriverBundle(),

Config

With this bundle installed you can setup your queue manager config similar to this:

mcfedr_queue_manager:
    managers:
        periodic:
            driver: periodic
            options:
                default_manager: delay
                default_manager_options: []

This will create a QueueManager service named "mcfedr_queue_manager.periodic"

  • default_manager - Default job processor, must support delayed jobs, for example Doctrine Delay
  • default_manager_options - Default options to pass to job processor put

Options to QueueManager::put

  • period - The average number of seconds between job runs
  • manager - Use a different job processor for this job
  • manager_options - Options to pass to the processors put method

Explanation

Commands

There are two commands that can be used to investigate how well spread jobs will. A simple way to visualize is to pipe into feedgnuplot.

rand-add uses a naive implementation of just adding a random number of seconds to get the time for the next run:

./tests/console test:distribution:rand-add -v | feedgnuplot --histogram 0 --binwidth 60 --hardcopy "rand-add.png" --exit

Graph of rand-add

periodic uses the bundle implementation:

./tests/console test:distribution:periodic -v | feedgnuplot --histogram 0 --binwidth 60 --hardcopy "periodic.png" --exit

Graph of periodic

Job Token

There is job_tokens argument which can help with job uniqueness.

Usage example

When put new periodic job, you get PeriodicJob object.

    $periodicJob = $this->manager->put('some_service', [
        'some_argument' => 'some_value',
    ], [
        'period' => 'some_seconds',
    ], 'periodic');

You can do $periodicJob->getToken() of it and store the token for job execution

While execution

 public function execute(array $arguments)
    {
        // Get the stored token
        ...

        if ($storedToken != $arguments['job_tokens']['token']) {
            throw new InvalidTokenException();
        }
        
        ...
        
        $storedToken = ($arguments['job_tokens']['next_token']);

        // Save stored token for next execition.
    }

Each job execution new token is generated so if some job duplication will appear only one will be executed and other jobs will fail