Swiftmailer 和 Symfony Messenger 无法在 docker 中使用 AMQP 和 rabbitmq

Swiftmailer and Symfony Messenger not working with AMQP and rabbitmq within docker

我急于完成一项任务。

我基本上尝试了所有方法,但无法找到解决方案。

我正在尝试使用 SymMessenger、AMQP、rabbitmq 和 docker.

使用 Swiftmailer 异步发送邮件

一切都已安装,但在 API 平台中,我总是遇到无法处理的错误。

想法是在持久化 MyEntity 实体上触发 __invoke 函数。我尝试使用 mailcatcher,一切正常,所以我尝试使用异步示例。

"Attempted to load class "AMQPConnection" from the global namespace.\nDid you forget a "use" statement for "PhpAmqpLib\Connection\AMQPConnection"?",",

我配置的参数以docker-compose.yml文件开头

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 

我的.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 class 我调度:

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';
  }
}

当我运行跟随命令phpbin/consolemessenger:consumeamqp在 docker 容器中我得到:

I 运行 容器带有 docker exec -ti rabbitmq_container 命令。

然后当我在 API 平台中执行实体持久化时,我从上面收到了消息。 当数据持久化被激活时,它 运行s sendWelcomeEmail() 有 dispatch 方法然后 __invoke.

我更改了 SwiftMailer 传输,但我认为这不是问题。

此问题是由于 swiftmailer 流程​​,它仅在 Kernel::terminate 事件上发送消息,但不会在工作进程上发生此事件。

要解决此问题,您应该:

  1. 调度 Events::UNSPOOL 事件 -
  2. 或使用symfony/mailer组件(symfony >= 4.3) - https://symfony.com/doc/4.3/mailer.html