Skip to content

Latest commit

 

History

History
120 lines (92 loc) · 3.58 KB

File metadata and controls

120 lines (92 loc) · 3.58 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 (e.g., SynchronousAdapter, or an adapter from external packages like Redis, AMQP, etc.)
  2. Worker - processes messages from the queue
  3. Queue - the main entry point for pushing messages

Example

use Yiisoft\Queue\Adapter\SynchronousAdapter;
use Yiisoft\Queue\Queue;
use Yiisoft\Queue\Worker\Worker;
use Yiisoft\Queue\Middleware\CallableFactory;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\Consume\MiddlewareFactoryConsume;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\FailureHandling\MiddlewareFactoryFailure;
use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher;
use Psr\Container\ContainerInterface;

// You need a PSR-11 container for dependency injection
/** @var ContainerInterface $container */

// Define message handlers
$handlers = [
    'file-download' => [FileDownloader::class, 'handle'],
    FileDownloader::class => [FileDownloader::class, 'handle'],
];

$callableFactory = new CallableFactory($container);

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

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

$pushMiddlewareDispatcher = new PushMiddlewareDispatcher(
    new MiddlewareFactoryPush($container),
);

// Create worker
$worker = new Worker(
    $handlers,
    $container->get(\Psr\Log\LoggerInterface::class),
    $container->get(\Yiisoft\Injector\Injector::class),
    $container,
    $consumeMiddlewareDispatcher,
    $failureMiddlewareDispatcher,
    $callableFactory,
);

// Create queue with adapter
$queue = new Queue(
    $worker,
    $pushMiddlewareDispatcher,
    $container->get(\Psr\EventDispatcher\EventDispatcherInterface::class),
    new SynchronousAdapter($worker, /* queue instance will be set via withAdapter */),
);

// Now you can push messages
$message = new \Yiisoft\Queue\Message\Message('file-download', ['url' => 'https://example.com/file.pdf']);
$queue->push($message);

Using Queue Provider

For multiple queue names, use AdapterFactoryQueueProvider:

use Yiisoft\Queue\Provider\AdapterFactoryQueueProvider;
use Yiisoft\Queue\Adapter\SynchronousAdapter;

$definitions = [
    'queue1' => new SynchronousAdapter($worker, $queue),
    'queue2' => static fn(SynchronousAdapter $adapter) => $adapter->withChannel('channel2'),
];

$provider = new AdapterFactoryQueueProvider(
    $queue,
    $definitions,
    $container,
);

$queueForQueue1 = $provider->get('queue1');
$queueForQueue2 = $provider->get('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