Swiftmailer и Symfony Messenger не работают с AMQP и rabbitmq в пределах docker - PullRequest
0 голосов
/ 04 августа 2020

Я отчаянно справляюсь с задачей.

Я пробовал все, но не могу найти решения.

Я пытаюсь отправлять почту с помощью Swiftmailer асинхронно, используя SymMessenger, AMQP, rabbitmq с docker.

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

Идея состоит в том, чтобы запустить функцию __invoke при сохранении объекта MyEntity. Я пробовал использовать mailcatcher, все работает, поэтому я пробовал использовать примеры asyn c.

"Попытка загрузить класс" AMQPConnection "из глобального пространства имен. \ NВы забыли" использовать "выражение для" PhpAmqpLib \ Connection \ AMQPConnection "?", ",

Я настроил параметры, начиная с docker -compose.yml file

version: '3'

services:
  rabbitmq: # The RabbitMQ container.
      container_name: rabbitmq_container
      build:
        context: .
        dockerfile: scripts/provision/docker/rabbitmq/Dockerfile
      volumes:
        - ./scripts/provision/docker/mysql/data:/var/lib/mysql:cached
      ports: [5672, 15672]

  container_php:
      container_name: container_php
      build: ./scripts/provision/docker/php-fpm/
      expose:
        - 9000
      volumes:
        - .:/var/www/html:cached
      environment:
        - MESSENGER_TRANSPORT_DSN=amqp://guest:guest@rabbitmq:5672/%2f/messages 

My .env файл

MESSENGER_TRANSPORT_DSN=amqp://guest:guest@127.0.0.1:5672/%2f/messages

файл messenger.yml

framework:
messenger:
    transports:
        # Uncomment the following line to enable a transport named "amqp"
        amqp_: '%env(MESSENGER_TRANSPORT_DSN)%'

    routing:
        # Route your messages to the transports
      'App\Entity\MyEntity': amqp

В отправке класса DataPersister:

private function sendWelcomeEmail(MyEntity $myEntity, MessageBus $messageBus)
{
    $messageBus->dispatch($myEntity);
}

И моя функция в EmailNotificationHandler.

public function __invoke(MyEntity $myEntity) :JsonResponse
{

    $message = (new \Swift_Message(
        'New comment on post'
    ))
        ->setFrom('sender@sent.com')
        ->setTo('recipient@recipient.com')
        ->setBody(
            'There is a new comment on post, check it out!',
            'text/html',
            'UTF-8'
        )
    ;

    $mailer->send($message);

    sleep(5);

    echo 'OK';
  }
}

Когда я запускаю следующую команду php bin / console messenger: потребляйте amqp в контейнере docker, я получаю:

Я запускаю контейнер с помощью команды docker exe c -ti rabbitmq_container .

А затем, когда я выполняю сохранение сущности на платформе API, я получил сообщение сверху. хранитель данных активирован, он запускает sendWelcomeEmail (), у которого есть метод отправки, а затем __invoke.

Я сменил транспорт SwiftMailer, но думаю, что это не проблема.

1 Ответ

0 голосов
/ 07 августа 2020

Эта проблема возникает из-за потока swiftmailer , он отправляет сообщения только при событии Kernel::terminate, но это событие не произойдет в рабочем процессе.

Чтобы решить эту проблему, вы следует:

  1. Отправка Events::UNSPOOL событие - { ссылка }
  2. Или используйте symfony/mailer компонент (symfony> = 4.3) - https://symfony.com/doc/4.3/mailer.html
...