Можем ли мы отправить событие из Rabbitmq Consumer в Symfony 4.3? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь отправить пользовательское событие от Потребителя Rabbitmq. Этот процесс раньше работал на 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 Потребитель выходит с успехом. Есть ли способ отладить или сделать эту работу?

Спасибо.

1 Ответ

0 голосов
/ 13 января 2020

Я понял, что мы можем отправить событие от Rabbitmq Consumer. Проблема заключалась в том, что SwiftMailer не отправлял электронные письма из отправленного события в Event Listener.

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, и потребители не получают завершения после подтверждения сообщения

Чтобы исправить проблему, все, что я сделал, это удалил функцию спулинга.

swiftmailer:
    url: '%env(MAILER_URL)%'
    transport: sendmail
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...