Installation
composer require draw/messenger
Ensure doctrine/doctrine-bundle and symfony/messenger are also installed.
Configuration
Add the transport to config/packages/symfony_messenger.yaml:
transports:
messenger_db:
dsn: 'doctrine://default'
options:
table_name: 'message'
queue_name: 'default'
lock_lifetime: 3600
retry_strategy:
max_retries: 3
delay: 1000
First Use Case Send a test message:
use Symfony\Component\Messenger\MessageBusInterface;
use App\Messages\TestMessage;
$bus->dispatch(new TestMessage('Hello, Messenger!'));
Verify the message in the message table (or your custom table).
Message Handling Use a worker to process messages:
use Symfony\Component\Messenger\Worker;
$worker = new Worker([$bus, $router], $transport);
$worker->run();
Run via CLI:
php bin/console messenger:consume messenger_db -vv
Custom Table Setup Extend the transport for custom tables:
options:
table_name: 'custom_messages'
Ensure the table exists (migrate via Doctrine).
Retry Strategies
Configure retries in config/messenger.yaml:
retry_strategy:
max_retries: 5
delay: 2000
multiplier: 2
Async Dispatching
Use AsyncBus for background processing:
$asyncBus = $container->get('messenger.bus.async');
$asyncBus->dispatch(new TestMessage('Async Task'));
Locking Issues
lock_expired and failed_at columns.lock_lifetime is sufficient for long-running tasks.Table Schema
table_name or extend the transport class:
use Draw\Messenger\Transport\DoctrineTransport;
class CustomDoctrineTransport extends DoctrineTransport {
protected function getTableName(): string {
return 'custom_messages';
}
}
Transaction Conflicts
AsyncBus instead).Log Failed Messages Enable Symfony’s messenger logging:
# config/packages/monolog.yaml
handlers:
messenger:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.messenger.log"
level: debug
Check Worker Status Use:
php bin/console messenger:failed-message-list messenger_db
Custom Middleware Add middleware to the bus:
# config/packages/messenger.yaml
middleware:
- App\Middleware\LoggingMiddleware
Event Listeners
Listen to MessageSentToTransportEvent or MessageFailedEvent:
use Symfony\Component\Messenger\Event\MessageSentToTransportEvent;
$dispatcher->addListener(
MessageSentToTransportEvent::class,
fn(MessageSentToTransportEvent $event) => Logger::info('Message sent!')
);
Doctrine Events Extend the transport to trigger events on message creation/failure:
use Doctrine\ORM\Event\LifecycleEventArgs;
$entityManager->getEventManager()->addEventListener(
Message::class,
[$this, 'onMessageFailure']
);
How can I help you explore Laravel packages today?