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
事件上发送消息,但不会在工作进程上发生此事件。
要解决此问题,您应该:
- 调度
Events::UNSPOOL
事件 -
- 或使用
symfony/mailer
组件(symfony >= 4.3) - https://symfony.com/doc/4.3/mailer.html
我急于完成一项任务。
我基本上尝试了所有方法,但无法找到解决方案。
我正在尝试使用 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
事件上发送消息,但不会在工作进程上发生此事件。
要解决此问题,您应该:
- 调度
Events::UNSPOOL
事件 - - 或使用
symfony/mailer
组件(symfony >= 4.3) - https://symfony.com/doc/4.3/mailer.html