/symfony-beanstalkd-messenger

Beanstalkd transport for symfony messenger

Primary LanguagePHPMIT LicenseMIT

Build Status Coverage Latest stable PHP from Packagist

Symfony beanstalkd messenger

Beanstalkd transport for symfony messenger

Installation

composer require retailcrm/symfony-beanstalkd-messenger

Usage

  • 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]

Allowed transport options

  • 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.