提问人:Eclip tique 提问时间:11/17/2023 最后编辑:Arleigh HixEclip tique 更新时间:11/20/2023 访问量:42
symfony/docker 的 |保存在通过Messenger发送的DB电子邮件中
symfony/docker | save in db email sent with messenger
问:
在带有 docker 环境的 symfony 项目中,我使用了 Messenger 组件,我配置了它,电子邮件是通过 messenger 发送的,很好。
发送电子邮件时,它们会从“messenger_message”表(链接到 Messenger 的表)中消失。
要发送电子邮件,我使用 messenger:consume 命令,但是当发送电子邮件时,它会从表中消失,因此我创建了一个订阅者将发送的电子邮件保存在另一个表中,当我键入命令 messenger:consume 时,订阅者有效。 但就我而言,这个命令已经在我的 docker messenger 容器中自动执行,此时我的订阅者不再工作...... 我查看了日志,没有什么令人担忧的,一切看起来都不错,但我的电子邮件根本没有保存。
你有没有遇到过这个问题?
我的订阅者 :
class MessengerMessageConsumedSubscriber implements EventSubscriberInterface
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [
WorkerMessageHandledEvent::class => 'onEmailSent',
];
}
public function onEmailSent(WorkerMessageHandledEvent $event)
{
$message = $event->getEnvelope()->getMessage();
$emailSent = new MessengerMessagesSent();
$emailSent->setFromEmail($message->getMessage()->getHeaders()->get('from')->getBody()[0]->getAddress());
$emailSent->setToEmail($message->getMessage()->getHeaders()->get('to')->getBody()[0]->getAddress());
$emailSent->setSubject($message->getMessage()->getHeaders()->get('subject')->getValue());
$this->entityManager->persist($emailSent);
$this->entityManager->flush();
}
}
我的 docker 命令在 messenger 容器中执行:
'sh -c "php-fpm & php bin/console messenger:consume async -vv --time-limit=3600 --failure-limit=10"'
还有我的messenger.yaml:
transports:
# https://symfony.com/doc/current/messenger.html#transport-configuration
async:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
use_notify: true
check_delayed_interval: 60000
retry_strategy:
max_retries: 3
multiplier: 2
delay: 30000
failed: 'doctrine://default?queue_name=failed'
sent: 'doctrine://default?queue_name=sent'
答:
您确定您的代码已在 docker 中更新吗?更改 php 代码时,当运行 php 守护程序(如 )时,代码不会自动更新。您必须手动重新启动使用者才能应用新代码,因为它已加载到内存中。messenger:consume
您还应该考虑在另一个容器中运行使用者。您现在正在后台启动 php-fpm 并启动消费者。您的 docker 守护程序无法以这种方式从 php-fpm 崩溃中恢复。
另一个建议是在不使用内置总线链的情况下防止信使链。它不会改进您的代码。在大多数情况下,不需要从其他异步消息发布新的异步消息。
我在我们公司管理着一个使用这种糟糕设计的软件,这是一场噩梦!
评论