Squeak.ru - шаблоны программирования

Можем ли мы отправить событие от Rabbitmq Consumer в Symfony 4.3?

Я пытаюсь отправить пользовательское событие от потребителя 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 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, и потребители не прекращались после подтверждения сообщения.

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

swiftmailer:
    url: '%env(MAILER_URL)%'
    transport: sendmail
13.01.2020
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...