https://github.com/agencypmg/queue-tactician
Integrate the wonderful Tactician library with pmg/queue.
https://github.com/agencypmg/queue-tactician
command-bus php pmg-queue pmg-queue-driver queue tactician
Last synced: 25 days ago
JSON representation
Integrate the wonderful Tactician library with pmg/queue.
- Host: GitHub
- URL: https://github.com/agencypmg/queue-tactician
- Owner: AgencyPMG
- License: apache-2.0
- Created: 2015-08-26T19:11:10.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2024-04-09T23:36:41.000Z (about 1 year ago)
- Last Synced: 2025-01-18T12:07:03.809Z (4 months ago)
- Topics: command-bus, php, pmg-queue, pmg-queue-driver, queue, tactician
- Language: PHP
- Homepage: http://pmg-queue.readthedocs.io/en/latest/
- Size: 39.1 KB
- Stars: 1
- Watchers: 16
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# pmg/queue-tactician
This is a middleware for [Tactician](http://tactician.thephpleague.com/) to
integrate it with [pmg/queue](https://github.com/AgencyPMG/Queue).## Installation and Usage
Install with composer.
```
composer require pmg/queue-tactician
```To use it, add the middleware to your middleware chain sometime before the
default command handler middleware.```php
use League\Tactician\CommandBus;
use League\Tactician\Handler\CommandHandlerMiddleware;
use PMG\Queue\Producer;
use PMG\Queue\Tactician\QueueingMiddleware;/** @var Producer */
$producer = createAQueueProducerSomehow();$bus = new CommandBus([
new QueueingMiddleware($producer),
new CommandHandlerMiddleware(/*...*/),
]);
```## Enqueueing Commands
Any command that implements `PMG\Queue\Message` will be put into the queue via
the producer and no further middlewares will be called.```php
use PMG\Queue\Message;final class DoLongRunningStuff implements Message
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'LongRunningStuff';
}
}// goes right into the queue
$bus->handle(new DoLongRunningStuff());
```## Dequeueing (Consuming) Commands
To use tactician to process the messages via the consumer, use
`PMG\Queue\Handler\TacticianHandler`.```php
use PMG\Queue\DefaultConsumer;
use PMG\Queue\Handler\TacticianHandler;/** @var League\Tactician\CommandBus $bus */
$handler = new TacticianHandler($bus);/** @var PMG\Queue\Driver $driver */
$consumer = new DefaultConsumer($driver, $handler);$consumer->run();
```The above assumes that the `CommandBus` instance still has the
`QueueingMiddleware` installed. If not, you'll need to use your own handler that
invokes the command bus, perhaps via `CallableHandler`.```php
use League\Tactician\CommandBus;
use League\Tactician\Handler\CommandHandlerMiddleware;
use PMG\Queue\DefaultConsumer;
use PMG\Queue\Message;
use PMG\Queue\Handler\CallableHandler;// no QueueingMiddleware!
$differentBus = new CommandBus([
new CommandHandlerMiddleware(/*...*/),
]);$handler = new CallableHandler([$bus, 'handle']);
/** @var PMG\Queue\Driver $driver */
$consumer = new DefaultConsumer($driver, $handler);$consumer->run();
```## Beware of Wrapping This Handler with `PcntlForkingHandler`
The shared instance of the command bus means that it's very likely that things
like open database connections will cause issues if/when a child press is forked
to handle messages.Instead a better bet is to create a new command bus for each message.
`CreatingTacticianHandler` can do that for you.```php
use League\Tactician\CommandBus;
use League\Tactician\Handler\CommandHandlerMiddleware;
use PMG\Queue\Message;
use PMG\Queue\Handler\CallableHandler;
use PMG\Queue\Tactician\QueuedCommand;
use PMG\Queue\Tactician\QueueingMiddleware;
use PMG\Queue\Handler\CreatingTacticianHandler;$handler = new CreatingTacticianHandler(function () {
// this is invoked for every message
return new CommandBus([
new QueueingMiddleware(createAProduerSomehow()),
new CommandHandlerMiddlware(/* ... */)
]);
});/** @var PMG\Queue\Driver $driver */
$consumer = new DefaultConsumer($driver, $handler);$consumer->run();
```