mcfedr / periodic-queue-driver-bundle
A bundle for running symfony background tasks with doctrine as the driver
Installs: 9 558
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 2
Forks: 1
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=5.5
- mcfedr/queue-manager-bundle: ^5.6.1
- nesbot/carbon: ^1|^2
- ramsey/uuid: ^3.7
- symfony/framework-bundle: ^3.0|^4.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.1
- phpunit/phpunit: ^4.1|^5.3
- symfony/browser-kit: ^3.0|^4.0
- symfony/monolog-bundle: ^2.8|^3.0
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.
Usage
There is no runner daemon for this driver as it just plugs into other drivers. Use it by
put
ting 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 Delaydefault_manager_options
- Default options to pass to job processorput
Options to QueueManager::put
period
- The average number of seconds between job runsmanager
- Use a different job processor for this jobmanager_options
- Options to pass to the processorsput
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
periodic
uses the bundle implementation:
./tests/console test:distribution:periodic -v | feedgnuplot --histogram 0 --binwidth 60 --hardcopy "periodic.png" --exit
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