【问题标题】:Swiftmailer and Symfony Messenger not working with AMQP and rabbitmq within dockerSwiftmailer 和 Symfony Messenger 不能在 docker 中使用 AMQP 和 rabbitmq
【发布时间】:2020-08-04 19:46:25
【问题描述】:

我对一项任务感到绝望。

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

我正在尝试通过将 SymMessenger、AMQP、rabbitmq 与 docker 一起使用,使用 Swiftmailer 异步发送邮件。

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

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

“尝试从全局命名空间加载类“AMQPConnection”。\n您是否忘记了“PhpAmqpLib\Connection\AMQPConnection”的“use”语句?”,,

我配置的参数都是从 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 类中:

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

当我在 docker 容器中运行以下命令 php bin/console messenger:consume amqp 时,我得到:

我使用 docker exec -ti rabbitmq_container 命令运行容器。

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

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

【问题讨论】:

    标签: php symfony rabbitmq amqp swiftmailer


    【解决方案1】:

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

    要解决此问题,您应该:

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

    【讨论】:

    • 非常感谢您的回答。我有以下错误:套接字错误:无法连接到主机。我已经尝试了一切,并且我的 rabbitmq 仪表板正在工作,所以我认为一切都在正常工作。这个错误可能是什么? @弗拉德
    猜你喜欢
    • 2021-06-18
    • 2013-02-15
    • 2012-09-09
    • 2017-04-22
    • 2016-04-03
    • 2019-12-07
    • 1970-01-01
    • 2018-07-24
    • 2023-03-16
    相关资源
    最近更新 更多