首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony messenger:消费不工作(无异常)

Symfony messenger:消费不工作(无异常)
EN

Stack Overflow用户
提问于 2020-07-15 21:15:46
回答 1查看 1.2K关注 0票数 1

Symfony 5.1

我正在尝试为我的项目设置异步电子邮件处理程序。电子邮件被发送到Doctrine messenger_messages表中,但是当我使用命令php bin/console messenger:consume -vv时,我在控制台中有[OK] Consuming messages from transports "async".消息,但是表中没有消息被传递。

编辑:昨天它起作用了,今天我再试一次,它就不起作用了。我在客户运行时重新启动了服务器,并在错误消息中显示:

代码语言:javascript
复制
An exception occurred while executing 'SELECT m.* FROM messenger_messages m WHERE (m.delivered_at is null
  OR m.delivered_at < ?) AND (m.available_at <= ?) AND (m.queue_name = ?) ORDER BY available_at ASC LIMIT 1
  FOR UPDATE' with params ["2020-07-16 07:20:55", "2020-07-16 08:20:55", "default"]:

  SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

我看到消费者检查'available_at <= 2020-07-16 08:20:55‘,而我表中较旧的消息是available_at 2020-07-16 09:33:30。我不知道如何改变这一点。

Edit2 :看起来我有一个时区问题:我的时区是UTC+2,现在是10:36,但在dev.log中,消费者正在处理08:36的请求:

代码语言:javascript
复制
[2020-07-16T08:36:44.241767+00:00] doctrine.DEBUG: "COMMIT" [] []
[2020-07-16T08:36:45.242051+00:00] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-07-16T08:36:45.242341+00:00] doctrine.DEBUG: SELECT m.* FROM messenger_messages m WHERE (m.delivered_at is null OR m.delivered_at < ?) AND (m.available_at <= ?) AND (m.queue_name = ?) ORDER BY available_at ASC LIMIT 1 FOR UPDATE ["2020-07-16T07:36:45+00:00","2020-07-16T08:36:45+00:00","default"] []

Edit3 :我的问题出在CLI使用的php.ini。我已经在Symfony使用的php.ini中定义了我的时区,但不是在CLI中,所以因为使用者是从控制台运行的,所以它是在UTC而不是UTC+2。

我的EmailHandler:

代码语言:javascript
复制
class EmailHandler implements MessageHandlerInterface
{
    private $address;
    private $mailer;

    public function __construct($address, MailerInterface $mailer)
    {
        $this->mailer = $mailer;
        $this->address = $address;
    }
    public function __invoke(Email $email)
    {
        $user =  $email->getTask()->getIdUser();
        $token = $user->getToken();
        $email = (new TemplatedEmail())
            ->from($this->address)
            ->to($user->getEmail())
            ->subject('Activation de compte Classe Virtuelle')
            ->htmlTemplate('emails/activate.html.twig')
            ->context([
                'address' => $user->getEmail(),
                'nom' => $email->getTask()->getNom(),
                'prenom' => $email->getTask()->getPrenom(),
                'token' => $token
            ]);
            $this->mailer->send($email);
    }

我的邮箱地址:

代码语言:javascript
复制
class Email
{
    private $task;

    /**
     * @return mixed
     */
    public function getTask()
    {
        return $this->task;
    }

    /**
     * @param mixed $task
     */
    public function setTask($task): void
    {
        $this->task = $task;
    }
}

messenger.yaml

代码语言:javascript
复制
    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\Controller\Message\Email': async

.env

代码语言:javascript
复制
MESSENGER_TRANSPORT_DSN=doctrine://default

我的控制器

代码语言:javascript
复制
            $email = new Email();
            $email->setTask($addUser);
            $messageBus->dispatch($email);

当我在控制器中发送电子邮件时,在表格中添加一行

代码语言:javascript
复制
100,
"O:36:\""Symfony\\Component\\Messenger\\Envelope\"":2:{s:44:\""\0Symfony\\Component\\Messenger\\Envelope\0stamps\"";a:1:{s:46:\""Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\"";a:1:{i:0;O:46:\""Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\"":1:{s:55:\""\0Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\0busName\"";s:21:\""messenger.bus.default\"";}}}s:45:\""\0Symfony\\Component\\Messenger\\Envelope\0message\"";O:28:\""App\\Controller\\Message\\Email\"":1:{s:34:\""\0App\\Controller\\Message\\Email\0task\"";O:17:\""App\\Entity\\Eleves\"":7:{s:21:\""\0App\\Entity\\Eleves\0id\"";N;s:26:\""\0App\\Entity\\Eleves\0id_user\"";O:16:\""App\\Entity\\Users\"":12:{s:20:\""\0App\\Entity\\Users\0id\"";N;s:29:\""\0App\\Entity\\Users\0identifiant\"";s:40:\""200c6d84e5eeeec42b1c7ea1ff2945340013f5db\"";s:21:\""\0App\\Entity\\Users\0mdp\"";s:40:\""f0f1b73b43acb236eb1388bd781189209361b8b2\"";s:23:\""\0App\\Entity\\Users\0email\"";s:20:\""zedzdezde@zedzde.zed\"";s:25:\""\0App\\Entity\\Users\0id_role\"";O:16:\""App\\Entity\\Roles\"":3:{s:20:\""\0App\\Entity\\Roles\0id\"";i:1;s:26:\""\0App\\Entity\\Roles\0nom_role\"";s:10:\""ROLE_ELEVE\"";s:23:\""\0App\\Entity\\Roles\0users\"";O:33:\""Doctrine\\ORM\\PersistentCollection\"":2:{s:13:\""\0*\0collection\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:14:\""\0*\0initialized\"";b:0;}}s:40:\""\0App\\Entity\\Users\0commentaires_concernes\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:37:\""\0App\\Entity\\Users\0commentaires_ecrits\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:29:\""\0App\\Entity\\Users\0sousgroupes\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:23:\""\0App\\Entity\\Users\0actif\"";i:0;s:24:\""\0App\\Entity\\Users\0admins\"";N;s:38:\""\0App\\Entity\\Users\0sousgroupes_visibles\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:23:\""\0App\\Entity\\Users\0token\"";s:40:\""f3ab58732b9bf1029f3105f65d2469fd955e61b6\"";}s:22:\""\0App\\Entity\\Eleves\0nom\"";s:7:\""aezdzed\"";s:25:\""\0App\\Entity\\Eleves\0prenom\"";s:9:\""zedzdezed\"";s:28:\""\0App\\Entity\\Eleves\0id_classe\"";O:18:\""App\\Entity\\Classes\"":6:{s:22:\""\0App\\Entity\\Classes\0id\"";i:1;s:30:\""\0App\\Entity\\Classes\0nom_classe\"";s:5:\""2nde1\"";s:26:\""\0App\\Entity\\Classes\0eleves\"";O:33:\""Doctrine\\ORM\\PersistentCollection\"":2:{s:13:\""\0*\0collection\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:14:\""\0*\0initialized\"";b:0;}s:25:\""\0App\\Entity\\Classes\0cours\"";O:33:\""Doctrine\\ORM\\PersistentCollection\"":2:{s:13:\""\0*\0collection\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:14:\""\0*\0initialized\"";b:0;}s:28:\""\0App\\Entity\\Classes\0archives\"";O:33:\""Doctrine\\ORM\\PersistentCollection\"":2:{s:13:\""\0*\0collection\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:14:\""\0*\0initialized\"";b:0;}s:25:\""\0App\\Entity\\Classes\0profs\"";O:33:\""Doctrine\\ORM\\PersistentCollection\"":2:{s:13:\""\0*\0collection\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:14:\""\0*\0initialized\"";b:0;}}s:32:\""\0App\\Entity\\Eleves\0id_sousgroupe\"";O:43:\""Doctrine\\Common\\Collections\\ArrayCollection\"":1:{s:53:\""\0Doctrine\\Common\\Collections\\ArrayCollection\0elements\"";a:0:{}}s:23:\""\0App\\Entity\\Eleves\0type\"";s:6:\""Eleves\"";}}}",
[],
default,
2020-07-15 16:05:25,
2020-07-15 16:05:25,
EN

回答 1

Stack Overflow用户

发布于 2021-11-23 16:08:18

检查您是否在php.ini中配置了正确的时区。Worker按created_at和available_at db列挑选和执行排队的任务。正如我在您提供的日志数据中看到的,您的PHP时区设置为UTC,这可能不是故意的。

日志:

代码语言:javascript
复制
[2020-07-16T08:36:45.242341+00:00] doctrine.DEBUG: SELECT m.* FROM messenger_messages m WHERE (m.delivered_at is null OR m.delivered_at < ?) AND (m.available_at <= ?) AND (m.queue_name = ?) ORDER BY available_at ASC LIMIT 1 FOR UPDATE ["2020-07-16T07:36:45+00:00","2020-07-16T08:36:45+00:00","default"] []

数据库:

代码语言:javascript
复制
2020-07-15 16:05:25,
2020-07-15 16:05:25,

如您所见,消息在7:30小时后排队。

https://www.php.net/manual/en/timezones.php在php.ini中设置适当的时区,然后重新启动服务。

如果您不知道php.ini位于何处,请运行以下命令:

代码语言:javascript
复制
php -i | grep php.ini
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62915762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档