Beanstalkd transport for symfony messenger
composer require retailcrm/symfony-beanstalkd-messenger
- in the
.env
config file add the connection credentials:
MESSENGER_TRANSPORT_DSN=beanstalkd://localhost:11300
-
create your messages and message handlers (about messages)
-
configure messenger in
config/packages/messenger.yml
, for example:
framework:
messenger:
transports:
async:
dsn: "%env(MESSENGER_TRANSPORT_DSN)%"
options:
queue_name: async
routing:
'App\Message\MyMessage': async
- add transport factory in
config/services.yml
services:
# ...
RetailCrm\Messenger\Beanstalkd\Transport\BeanstalkTransportFactory:
tags: [messenger.transport_factory]
-
tube_name
- tube name in beanstalkd -
timeout
- timeout for receiving jobs from tube. Default - 0 -
ttr
- ttr value for jobs. Default - 60 -
not_send_if_exists
- do not send a job to the queue only if such a job is already exist. Default -false
All options are optional, if tube_name
not specified will be used default queue default
.
The not_send_if_exists
option will only work if lock storage is specified. To do this, you need to customize the BeanstalkTransportFactory
by adding a call to the setLockStorage
method
class MyBeanstalkTransportFactory extends BeanstalkTransportFactory
//...
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface
{
return new BeanstalkTransport(
Connection::fromDsn($dsn, $options)->setLockStorage($this->lockStorage),
$serializer
);
}
//...
and add your custom transport factory in config/services.yml
services:
# ...
App\Messenger\Custom\MyBeanstalkTransportFactory:
tags: [messenger.transport_factory]
Your lock storage class must implement RetailCrm\Messenger\Beanstalkd\Storage\LockStorageInterface
.