【问题标题】:Response from queue来自队列的响应
【发布时间】:2020-10-26 15:41:53
【问题描述】:

我在 TypeScript 和 NestJS 中使用 BullQueue 创建了一个简单的队列作业系统,如下所示:

    async addToQueue(): Promise<void> {
        try {
            await this.reportQueue.add('generate_report', {
                //some data
            })
            this.logger.log(`Added to queue.`)
        } catch (error) {
            this.logger.error(`Not added to Queue.`);
        }
    }


    @Process('generate_report')
    async generateReport(job: Job<{options: ReportFilterDto, context: CustomContext, reportType: Type, worktime?: WorktimeDto}>): Promise<any> {
        try {
            //some working code
        } catch (error) {
            //
        }
    }

    @OnQueueActive()
    async onActive(job: Job): Promise<void> {
        //
    }

    @OnQueueCompleted()
    async onCompleted(job: Job): Promise<void> {
        //
    }

    @OnQueueWaiting()
    async onWaiting(job: Job): Promise<void> {
        //
    }

    @OnQueueFailed()
    onError(job: Job<any>, error: BadRequestException): void {
        //
    }

我从我的控制器运行我的函数addToQueue(),在那里我提供了一个参数,buuuuuut 是否可以从队列中向客户端返回有关成功或失败作业的任何响应? 如果可能的话,有人可以告诉我怎么做吗?

感谢您的帮助

./////////////////////.

【问题讨论】:

标签: javascript typescript queue nestjs


【解决方案1】:

马上,真的没有办法。那里有一个队列,因此您可以运行异步任务而不会阻塞主线程或以任何方式阻止服务器。如果您想要返回结果,取决于队列正在运行的作业,您可能要等待几秒钟到几天(有点夸张,但它明白了重点)。你可以做的是两件事之一(至少立即想到)

  1. 返回您创建的与此作业相关的 ID。作业完成后,将具有该 ID 的结果保存到数据库中。然后,用户可以随时请求状态。

  2. 记下发送请求的用户,并在作业完成后向该用户发送电子邮件。这将需要更多的集成,但可以通过“Ping 每隔一段时间,我们会告诉你是否完成”获得更准确的结果。

这两种方法都有效,您甚至可以将两者结合起来(可能是两全其美的方法,因此您可以保存结果在完成时提醒用户)。

【讨论】:

  • await job.finished() 会工作,不是吗?当然,这是否是一个“好主意”取决于用例。
  • 可能。真的不知道这是一件事
  • 我也不是——我发现了一些非常模糊的引用,尝试了一下,它似乎按预期工作!它适用于成功和失败。我看到的一大缺点是,我猜如果 Job 停止,只要 Bull 保持 Job 处于活动状态,它就会很高兴地继续等待。因此,您需要确保适当地设置作业/队列的超时时间,否则您可能会很快耗尽网络服务器上的资源。
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2020-09-07
  • 2014-09-16
  • 1970-01-01
  • 2012-11-15
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多