Skip to content

Latest commit

 

History

History
119 lines (91 loc) · 3.52 KB

File metadata and controls

119 lines (91 loc) · 3.52 KB

Manual Configuration (without yiisoft/config)

This guide explains how to set up the queue component manually, without using yiisoft/config.

Basic setup

To use the queue, you need to create instances of the following classes:

  1. Adapter - handles the actual queue backend like AMQP, Redis, etc.
  2. Worker - processes messages from the queue
  3. Queue - the main entry point for pushing messages

Example

use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use Yiisoft\Injector\Injector;
use Yiisoft\Queue\Cli\SimpleLoop;
use Yiisoft\Queue\Middleware\CallableFactory;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareFactory;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory;
use Yiisoft\Queue\Queue;
use Yiisoft\Queue\Worker\Worker;

// A PSR-11 container is required for resolving dependencies of middleware and handlers.
// How you build it is up to you.
/** @var ContainerInterface $container */

$logger = new NullLogger(); // replace with your PSR-3 logger in production

// Define message handlers
$handlers = [
    DownloadFileMessage::TYPE => [FileDownloader::class, 'handle'],
];

$callableFactory = new CallableFactory($container);

// Create middleware dispatchers
$consumeMiddlewareDispatcher = new ConsumeMiddlewareDispatcher(
    new ConsumeMiddlewareFactory($container, $callableFactory),
);

$failureMiddlewareDispatcher = new FailureMiddlewareDispatcher(
    new FailureMiddlewareFactory($container, $callableFactory),
    [],
);

$pushMiddlewareConfig = new PushMiddlewareConfig(
    new PushMiddlewareFactory($container, $callableFactory),
);

// Create worker
$worker = new Worker(
    $handlers,
    $logger,
    new Injector($container),
    $container,
    $consumeMiddlewareDispatcher,
    $failureMiddlewareDispatcher,
    $callableFactory,
);

// Create loop (SignalLoop requires ext-pcntl; SimpleLoop works without it)
$loop = new SimpleLoop();

// Create queue. Without an adapter the queue runs in synchronous mode (messages are processed
// immediately on push). Pass an adapter (e.g., AMQP, Redis) for asynchronous processing.
$queue = new Queue(
    $worker,
    $loop,
    $logger,
    $pushMiddlewareConfig,
);

// Now you can push messages
$message = new DownloadFileMessage(url: 'https://example.com/file.pdf', destinationPath: '/tmp/file.pdf');
$queue->push($message);

Using Queue Provider

For multiple queue names, use PredefinedQueueProvider (maps queue names to pre-built queue instances):

use Yiisoft\Queue\Provider\PredefinedQueueProvider;

// PredefinedQueueProvider: pass fully built queue instances.
$provider = new PredefinedQueueProvider([
    'queue1' => $queue1,
    'queue2' => $queue2,
]);

Running the queue

Processing existing messages

$queue->run();      // Process all messages
$queue->run(10);    // Process up to 10 messages

Listening for new messages

$queue->listen();   // Run indefinitely

Next steps