0

我有一个控制器,假设运行import. 导入过程可能需要很长时间,所以我决定使用message queue(异步)。我创建了一个wrapper接口,该接口具有import封装实现的方法。从控制器的角度来看,它不应该关心它是如何导入的(无论是直接导入还是异步导入)。但是原始代码可能会抛出异常,如果它是异步的,则无法在控制器中捕获这些异常。

public function execute()
{
    try {
        $this->importer->import();
        $this->messageManager->addSuccessMessage(__('The import has been successfully performed.'));
    } catch (Exception $e) {
        $this->logger->error($e->getMessage());
    }

我的意思是问题在于,如果我将异步导入器与原始导入器交换,我们可以知道它是成功还是失败。但是当我们使用异步的时候,代码不能简单地输出“导入成功”,也不能输出“导入已经调度”,因为这是一个实现细节泄漏。

有关如何解决此问题的任何建议?

更新:我认为这是两个不同的职责:

  1. 进口
  2. 安排导入

所以我想它们根本不能互换。

4

1 回答 1

0

因此,经过深思熟虑后,我得出结论,运行脚本和调度它是两个独立的操作。最初我认为它们应该只在实现细节的范围上有所不同;我掉进了这个陷阱,因为读取 MQ 的 cron 每分钟都在运行,所以调度脚本的执行似乎几乎是立即运行,就像直接运行一样。

所以有了这个结论,我决定更进一步,将整个事情重命名为“调度操作”而不是“运行操作”。我想用户需要知道它将被安排而不是仅仅运行。如果用户感到困惑并问 WTF?为什么它不能直接运行呢?然后有人会回答:嗯,调度比运行更好,因为 A、B 和 C。

于 2022-03-01T22:00:35.353 回答