Symfony 4 Messenger and Beanstalkd Queue Integration
I use Laradoc in development environment. I think Laradoc is initial setting. I will explain a sample application step by step.
- We are launching the Docker containers with the following command
docker-compose up -d workspace nginx mysql beanstalkd beanstalkd-console
2. We are connect to workspace with following command
docker-compose exec workspace bash
3. We come to directory that we set as a project directory. Create a empty project and go to the project directory
composer create-project symfony/skeleton my-project && cd my-project
4. We are installing the necessary packages for the queue and sample project
composer req --dev make
composer req annotation
composer req messenger
composer req symfony/serializer-pack
composer req enqueue/messenger-adapter
composer req enqueue/pheanstalk
Note: We always confirm the questions in the package installation. And do not seriously ignore the warnings from the parameters.
5. We get a copy of .env file in the project directory and save it as .env.local
6. We set the following parameter in the .env.local file
ENQUEUE_DSN=beanstalk://beanstalkd:11300/default
7. /config/packages/messenger.yml open this file and make it as in the code below
framework:
messenger:
transports:
test: enqueue://default
routing:
'App\Message\SmsNotification': test
8. /config/packages/enqueue.yml open this file and make it as in the code below
enqueue:
default:
transport: '%env(ENQUEUE_DSN)%'
client: ~
9. /config/packages/services.yml open this file and make it as in the code below
parameters:
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
App\MessageHandler\SmsNotificationHandler:
tags: [messenger.message_handler]
10. /src/Message/SmsNotification.php create this file and paste the following codes
<?php
namespace App\Message;
class SmsNotification
{
private $content;
public function __construct(string $content)
{
$this->content = $content;
}
public function getContent(): string
{
return $this->content;
}
}
11. /src/Message/SmsNotificationHandler.php create this file and paste the following codes
<?php
namespace App\MessageHandler;
use App\Message\SmsNotification;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
class SmsNotificationHandler implements MessageHandlerInterface
{
public function __invoke(SmsNotification $message)
{
for ($i=0; $i<10; $i++) {
echo $i.'-Merhaba23 '.$message->getContent()."\n";
sleep(1);
}
}
}
12. /src/Controller/DefaultController.php create this file and paste the following codes
<?php
namespace App\Controller;
use App\Message\SmsNotification;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
class DefaultController extends AbstractController
{
/**
* @Route("/default", name="default")
*/
public function index(MessageBusInterface $bus)
{
$bus->dispatch(new SmsNotification('A string to be sent...'));
return $this->json([
'message' => 'Welcome to your new controller!',
'path' => 'src/Controller/DefaultController.php',
]);
}
}
13. We are now running the following command from the console. But we are not close.
php bin/console messenger:consume-messages
14. We have come to end. Now we open the link(for my-project) from our browser. Json data in the browser while the console 10 times will “write a string to sent…”