Можем ли мы отправить событие от 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
Другие вопросы по тегам