symfony/docker 的 |保存在通过Messenger发送的DB电子邮件中

symfony/docker | save in db email sent with messenger

提问人:Eclip tique 提问时间:11/17/2023 最后编辑:Arleigh HixEclip tique 更新时间:11/20/2023 访问量:42

问:

在带有 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 symfony symfony-messenger

评论

0赞 Nico Haase 11/17/2023
“不再有效”是什么意思?在“手动”执行和通过 Docker 容器执行(尚未共享任何详细信息)之间运行 consume 命令有何不同
0赞 Eclip tique 11/17/2023
不知道为什么手动执行 consume 命令会有所不同,docker 在启动时会执行它,我没有任何错误消息可以让我走上正轨。在我的docker-compose.yaml中,在Messenger部分,我使用这个cmd:命令:'sh -c “php-fpm & php bin/console messenger:consume async -vv --time-limit=3600 --failure-limit=10”'
0赞 Nico Haase 11/17/2023
请通过编辑为您的问题添加所有澄清

答:

-1赞 Leroy 11/20/2023 #1

您确定您的代码已在 docker 中更新吗?更改 php 代码时,当运行 php 守护程序(如 )时,代码不会自动更新。您必须手动重新启动使用者才能应用新代码,因为它已加载到内存中。messenger:consume

您还应该考虑在另一个容器中运行使用者。您现在正在后台启动 php-fpm 并启动消费者。您的 docker 守护程序无法以这种方式从 php-fpm 崩溃中恢复。

另一个建议是在不使用内置总线链的情况下防止信使链。它不会改进您的代码。在大多数情况下,不需要从其他异步消息发布新的异步消息。

我在我们公司管理着一个使用这种糟糕设计的软件,这是一场噩梦!