使用doctrine队列异步发送邮件-Symfony5全面开发

您需要登录后才可观看此视频

为了更好的为您提供服务,请您登录后再查看本课程。

立即登录

我们取消.env文件中doctrine传输队列前的注释,再打开messenger.yaml配置文件。在transports配置下,我们启用async传输队列,async传输队列使用的就是.env文件中的doctrine队列。注释第10行代码,我们将SendEmailMessage消息发送到async队列中。

#config/packages/messenger.yaml

framework:
    messenger:
        # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
        # failure_transport: failed

        transports:
            # https://symfony.com/doc/current/messenger.html#transport-configuration
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
            # failed: 'doctrine://default?queue_name=failed'
            # sync: 'sync://'

        routing:
            # Route your messages to the transports
            'App\Message\SendEmailMessage': async

回到浏览器,我们打开管理端添加一篇文章,点击文章列表。点击新增文章,文章的名称叫做Hello world abc,点击添加按钮。现在我们看到点击添加之后,页面就快速的进行了跳转,并没有再等待10秒钟。我们查看数据库,打开数据库客户端,刷新数据库表,自动添加的一个消息队列表。

我们查看表中的数据,在表中添加了一个消息,我们查看body的内容。在body中保存的就是我们SendEmailMessage对象,它的属性是postId,id为315。

回到浏览器,我们查看mailcatcher,仍然是之前的三封邮件,我们没有接收到新的邮件。回到项目,打开控制台,输入symfony console,查看所有的命令行。messenger组件在命令行中新增了三个命令行。我们可以使用messenger:consume命令行来对队列中的消息进行消费,也就是进行处理。

复制命令行,输入symfony console 粘贴messenger:consume,现在messenger组件会从async队列中获取消息,并且进行消费。回到浏览器,我们的邮件成功的进行了发送。查看数据库,刷新messages表,我们表中的消息,被消费之后也自动的进行了删除。这就是异步消息的发布流程。

我们看命令行,命令行中提示我们可以使用-vv选项,来查看消息队列处理的日志。按着ctrl+c退出命令行,重新执行命令行 -vv。回到浏览器,我们再次新增一篇文章,hello 123,点击添加。

我们看到consume命令行,首先获取到了队列中的消息,然后调用Handler类的__invoke()方法,我们看到第二条日志显示之前,等待了10秒钟。然后显示我们的消息已经被Handler类进行了处理,最后向传输队列发送了一个确认消息,队列再将数据库中的数据进行了删除。

我们的mailcatcher,也收到了第五封邮件。在下节课,我们来了解一下当网络出现错误导致邮件发送失败时,消息队列的处理流程。

课程讨论

当前内容评论功能已关闭。