Можем ли мы отправить событие от Rabbitmq Consumer в Symfony 4.3?
Я пытаюсь отправить настраиваемое событие от Rabbitmq Consumer. Этот процесс использовался для работы с Symfony 3.4, недавно был обновлен проект до Symfony Flex(4.3).
DatasetSubmissionConsumer.php
use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
/**
* A consumer of dataset submission messages.
*
* @see ConsumerInterface
*/
class DatasetSubmissionConsumer implements ConsumerInterface
{
/**
* The entity event dispatcher.
*
* @var EntityEventDispatcher
*/
protected $entityEventDispatcher;
/**
* Constructor.
*
* @param EntityEventDispatcher $entityEventDispatcher The entity event dispatcher.
*/
public function __construct(
EntityEventDispatcher $entityEventDispatcher,
) {
$this->entityEventDispatcher = $entityEventDispatcher;
}
/**
* Process a filer message.
*
* @param AMQPMessage $message A filer message.
*
* @return boolean True if success, false otherwise.
*/
public function execute(AMQPMessage $message)
{
$datasetSubmissionId = $message->body;
// Do Something //
$this->entityEventDispatcher->dispatch($datasetSubmission, 'dataset_processed');
return true;
}
}
DatasetSubmissionListener.php
/**
* Listener class for Dataset Submission-related events.
*/
class DatasetSubmissionListener
{
/**
* Method to send an email to DRPM on a dataset_processed event.
*
* @param EntityEvent $event Event being acted upon.
*
* @return void
*/
public function onDatasetProcessed(EntityEvent $event)
{
$datasetSubmission = $event->getEntity();
// Added if-statement so that emails are sent to data-managers only
// Do Something and send Email
}
}
EntityEventDispatcher.php
<?php
namespace App\Event;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* An entity event dispatcher.
*/
class EntityEventDispatcher
{
/**
* The event dispatcher to use in this entity event dispatcher.
*
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* Constructor.
*
* @param EventDispatcherInterface $eventDispatcher The event dispatcher to use.
*/
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
/**
* Dispatch an Entity event.
*
* @param Entity $entity The Entity the event is for.
* @param string $entityEventName The name of the entity event.
*
* @return void
*/
public function dispatch(Entity $entity, string $entityEventName)
{
$this->eventDispatcher->dispatch(
'pelagos.entity.' . $entity->getUnderscoredName() . '.' . $entityEventName,
new EntityEvent($entity)
);
}
}
App\Event\DatasetSubmissionListener:
tags:
- { name: kernel.event_listener, event: pelagos.entity.dataset_submission.dataset_processed, method: onDatasetProcessed }
Также запустил bin/console debug:event-dispatcher
и событие вызывается
"pelagos.entity.dataset_submission.dataset_processed" event
-----------------------------------------------------------
------- ----------------------------------------------------------- ----------
Order Callable Priority
------- ----------------------------------------------------------- ----------
#1 App\Event\DatasetSubmissionListener::onDatasetProcessed() 0
------- ----------------------------------------------------------- ----------
Использование Symfony 4.3, Rabbitmq 3.3.5
Слушатель событий не улавливает это отправленное событие после успешного выхода Rabbitmq Consumer. Есть ли способ отладить или заставить это работать?
Спасибо.
1 ответ
Я понял, что мы можем отправить событие из Rabbitmq Consumer. Проблема заключалась в том, что SwiftMailer не отправлял электронные письма из отправленного события в прослушивателе событий.
DatasetSubmissionListener.php
/**
* Listener class for Dataset Submission-related events.
*/
class DatasetSubmissionListener
{
/**
* Method to send an email to DRPM on a dataset_processed event.
*
* @param EntityEvent $event Event being acted upon.
*
* @return void
*/
public function onDatasetProcessed(EntityEvent $event)
{
$datasetSubmission = $event->getEntity();
// Added if-statement so that emails are sent to data-managers only
// Do Something and send Email
sendEmailMessage($this->twig->load('Email/data-repository-managers.dataset-processed.email.twig'), $this->tokenStorage->getToken()->getUser());
}
/**
* Method to build and send an email.
*
* @param \Twig\TemplateWrapper $emailTwigTemplate A twig template.
* @param array $mailData Mail data array for email.
* @param array $toAddresses Recipient's email addresses.
* @param array $attachments An optional array of Swift_Message_Attachments to attach.
*
* @throws \InvalidArgumentException When any element of $attachments is not a Swift_Message_Attachment.
*
* @return void
*/
public function sendEmailMessage(
\Twig\TemplateWrapper $emailTwigTemplate,
array $mailData,
array $toAddresses = array(),
array $attachments = array()
) {
$message = new \Swift_Message();
$message
->setSubject($emailTwigTemplate->renderBlock('subject', $mailData))
->setFrom($this->from)
->setTo($toAddresses)
->setBody($emailTwigTemplate->renderBlock('body_html', $mailData), 'text/html')
->addPart($emailTwigTemplate->renderBlock('body_text', $mailData), 'text/plain');
foreach ($attachments as $attachment) {
if (!$attachment instanceof \Swift_Attachment) {
throw new \InvalidArgumentException('Attachment is not an instance of Swift_Attachment');
}
$message->attach($attachment);
}
$this->mailer->send($message);
}
}
Конфигурация, которая у меня была для swiftmailer ранее:
swiftmailer:
url: '%env(MAILER_URL)%'
transport: sendmail
spool: { type: memory }
Поскольку у меня была включена функция спула, swiftmailer ждал события завершения ядра от Rabbitmq Consumers, и потребители не завершаются после подтверждения сообщения
Чтобы решить эту проблему, все, что я сделал, это удалил функцию катушки.
swiftmailer:
url: '%env(MAILER_URL)%'
transport: sendmail