【发布时间】: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