首页 > 解决方案 > 来自队列的响应

问题描述

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

    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 是否可以从队列中向客户端返回有关成功或失败作业的任何响应?如果可能的话,有人可以展示怎么做吗?

谢谢你的帮助

.//////////////////////。

标签: javascripttypescriptqueuenestjs

解决方案


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

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

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

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


推荐阅读