首页 > 解决方案 > Messenger 工作人员在 Symfony 4 测试中闲置/不“工作”

问题描述

我正在尝试测试我通过 Symfony 中的 Messenger 处理一些数据的过程。

我尝试以下方法:

首先,我定义了我的工人。

$event_dispatcher = $this->getContainer()->get(EventDispatcherInterface::class);
$logger = $this->getContainer()->get(LoggerInterface::class);
$message_bus = $this->getContainer()->get(MessageBusInterface::class);
$transport = $this->getContainer()->get("messenger.transport.async");
$worker = new Worker([$transport], $message_bus, $event_dispatcher, $logger);

然后在此之后,一些代码运行,向信使发送消息。我测试了这段代码,效果很好。通过转储 $transport->get() 我看到我的消息已成功发送到工作人员和数据库。

现在在我的单元测试结束时,我通过 $worker->run() 运行 worker。由于信使只处理几个动作/查询,它应该只需要一点时间就可以完成。但看起来它只是在那里闲置。我在 $worker->run() 之后直接调用 $worker->stop() 但它没有到达那里。

标签: phpsymfony4symfony-messenger

解决方案


除非您设置限制或工作人员崩溃,否则将Worker继续运行并处理队列,因此您看到的行为是有意的。

您可以使用官方提供的以下代码示例ConsumeMessagesCommand来修改您的工人:

<?php

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Messenger\EventListener\StopWorkerOnMessageLimitListener;
use Symfony\Component\Messenger\EventListener\StopWorkerOnTimeLimitListener;

$eventDispatcher->addSubscriber(
  // stop after 10 messages (but won't stop when fewer are processed)
  new StopWorkerOnMessageLimitListener(10)
);

$eventDispatcher->addSubscriber(
  // stop after 10 seconds (can take longer when the message processing exceeds the 10 seconds)
  new StopWorkerOnTimeLimitListener(10)
);


推荐阅读