Custom Queue Handler For Laravel
, (*1)
Laravel custom Queue Handler is a simple implementation of the laravel-esque queue handling for all queues and messages that are not part of the Laravel Framework., (*2)
There are times when your application would want to consume messages as a JSON, sent on a Queue that does not implement the Laravel Job., (*3)
This package aims to solve that use case., (*4)
Supports the same commands as Laravel, with the same parameters, with one additional Parameter:
- custom-queue:work --handler="Class\Path\To\Handler"
, (*5)
-
custom-queue:listen --handler="Class\Path\To\Handler"
, (*6)
-
custom-queue:restart
, (*7)
Currently Supported Queues:
- RabbitMQ, (*8)
Laravel Version Compatibility
- Laravel
4.x
is not supported.
- Laravel
5.x.x
is supported from 5.1
in the respective branch.
Installation
Laravel 5.x
Install the vnay92/laravel-custom-queue
package:, (*9)
$ composer require vnay92/laravel-custom-queue
You'll need to add the following to your config/app.php
:, (*10)
'providers' => array(
// ...
Vnay92\CustomQueue\CustomQueueServiceProvider::class,
)
Configuration
Create the Custom Queue configuration file (config/custom-queue.php
):, (*11)
$ php artisan vendor:publish --provider="Vnay92\CustomQueue\CustomQueueServiceProvider"
And add these properties to .env
with proper values:, (*12)
CUSTOM_QUEUE_DRIVER=rabbitmq
RABBITMQ_HOST=127.0.0.1
RABBITMQ_PORT=5672
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_QUEUE=queue_name
The above commands and configurations are used as follows:, (*13)
/* path/to/project/config/custom-queue.php */
return [
/*
|--------------------------------------------------------------------------
| Default Queue Driver
|--------------------------------------------------------------------------
|
| The API, based on the Laravel queue API supports a variety of back-ends via an unified
| API, giving you convenient access to each back-end using the same
| syntax for each one. Here you may set the default queue driver.
|
| Supported: "rabbitmq"
|
*/
'default' => env('CUSTOM_QUEUE_DRIVER', 'rabbitmq'),
/*
|--------------------------------------------------------------------------
| Queue Connections
|--------------------------------------------------------------------------
|
| Here you may configure the connection information for each server that
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
*/
'connections' => [
'rabbitmq' => [
'driver' => 'rabbitmq',
'host' => env('RABBITMQ_HOST', 'localhost'),
'port' => env('RABBITMQ_PORT', 5672),
'vhost' => env('RABBITMQ_VHOST', '/'),
'login' => env('RABBITMQ_LOGIN', 'guest'),
'password' => env('RABBITMQ_PASSWORD', 'guest'),
'queue' => env('RABBITMQ_QUEUE', 'custom_default'), // name of the default queue,
'exchange_declare' => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists
'queue_declare_bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange
'queue_params' => [
'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
],
'exchange_params' => [
'name' => env('RABBITMQ_EXCHANGE_NAME', null),
'type' => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts
'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
],
],
],
/*
|--------------------------------------------------------------------------
| Failed Queue Jobs
|--------------------------------------------------------------------------
|
| These options configure the behavior of failed queue job logging so you
| can control which database and table are used to store the jobs that
| have failed. You may change them to any database / table you wish.
|
*/
'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
];
Example
Create a handler class which implements the Vnay92\Contracts\HandlerInterface
and implement the handle()
method., (*14)
<?php
namespace App\Services\ExternalMessagesService;
use App\Utility\UserAuth;
/**
* Class ExternalMessagesService
*
* @package App\Services\ExternalMessagesService
*/
class ExternalMessagesService
{
/**
* @var array
*/
private $serviceTableMap = [];
/**
* @var UserAuth
*/
private $userAuth;
/**
* ExternalMessagesService constructor.
*
* @param UserAuth $userAuth
*/
public function __construct(UserAuth $userAuth)
{
$this->userAuth = $userAuth;
$this->serviceTableMap = [
'mail_service' => \App::make(StoreService::class),
];
}
/**
* Handle External Service messages.
*
* @param array $message
*
* @return void
* @throws \Exception
*/
public function handle(array $message)
{
$source = array_get($message, 'source');
if (!isset($this->serviceTableMap[$source])) {
\Log::error('[EXTERNAL_SERVICE] Event Not Recognised: ', [$source]);
return;
}
// set seller context
if ($this->userAuth->login(null, $message['userId'])) {
// Handle the data in the respective class.
return $this->serviceTableMap[$message['source']]->handle($message);
}
return;
}
}
Then start listening to the queues as follows:, (*15)
$ php artisan custom-queue:work --handler="App\Services\ExternalMessagesService\ExternalMessagesService" --queue=custom_queue
, (*16)
Contributing
Dependencies are managed through composer:, (*17)
$ composer install
TODOs
- Provide many Queues Connector
- Tests using PHPUnit
- DocBlokr for all methods and members
- Provide support for each version of Laravel.