从异步操作获取数据

问题描述 投票:0回答:1

在 Symfony 6 中,我需要调用第一个对象(名为 Script),然后这个对象将调用第二个对象(规则),这个规则将调用执行各种操作的最后一个对象(条件)。一旦 Condition 对象完成其工作,它必须将其结果发送回 Rule 对象,Rule 对象应该将其传递给第一个 Script 对象。 我想使用 Messenger 来管理此工作流程,因为我需要将这些不同的对象存储在队列中并异步处理它们。另一方面,我知道 Messenger 的设计初衷并不是在消息完成后返回数据;因此,我考虑让消息处理程序调度事件,每个调用者对象都会监听以获取其子响应:

#[AsMessageHandler]
readonly final class CritereMessageHandler
{
    public function __construct(
        private EntityManagerInterface $em,
        private AlarmHelper $alarmHelper,
        private EventDispatcherInterface $dispatcher
    ) {}

    /**
     * @param CritereMessage $message
     * @return void
     * @throws Exception
     */
    public function __invoke(CritereMessage $message): void
    {
        $critere = $this->em->getRepository(Critere::class)
            ->find($message->getId());
        $query = $this->em->getConnection()->executeQuery($critere->getRequete())->fetchOne();
        $result = $this->alarmHelper->parseEvaluation(
            $query,
            $critere->getEvaluation()->getOperateur(),
            $critere->getEvaluation()->getValeur1(),
            $critere->getEvaluation()->getValeur2()
        );
        $message->setResult($result);

        $this->dispatcher->dispatch(
            new CriteriumResponseEvent($message),
            CriteriumResponseEvent::NAME
        );
    }
}

class CriteriumResponseEvent extends Event
{
    public const NAME = 'alarm.criterium.response';

    public function __construct(private readonly CritereMessage $criterium) {}

    public function getCriterium(): CritereMessage
    {
        return $this->criterium;
    }
}
class AlarmTestCommand extends Command
{
    public function __construct(
        private readonly MessageBusInterface $messageBus,
        private readonly EventDispatcherInterface $dispatcher
    )
    {
        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        $envelope = $this->messageBus->dispatch(new CritereMessage('leclair', 2, 'xxx', 'yyy'));
        $this->dispatcher->addListener(CriteriumResponseEvent::NAME, function (CriteriumResponseEvent $event): void {
            // dump is not called
            dump($event);
        });

        $io->success('You have a new command! Now make it your own! Pass --help to see your options.');

        return Command::SUCCESS;
    }
}

我的问题是,经过各种尝试后,我无法从主进程中的事件监听器获取数据。我不明白我会错过什么,有人看到出了什么问题吗?

提前致谢

symfony asynchronous symfony-messenger symfony-eventdispatcher
1个回答
0
投票

我选择了不同的概念来满足我的需求。

© www.soinside.com 2019 - 2024. All rights reserved.