javascript - 来自队列的响应
问题描述
我使用BullQueue
TypeScript 和 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 是否可以从队列中向客户端返回有关成功或失败作业的任何响应?如果可能的话,有人可以展示怎么做吗?
谢谢你的帮助
.//////////////////////。
解决方案
马上,真的没有办法了。那里有一个队列,因此您可以运行异步任务而不会阻塞主线程或以任何方式阻止服务器。如果您想要返回结果,取决于队列正在运行的作业,您可能要等待几秒钟到几天(有点夸张,但它明白了重点)。你可以做的是两件事之一(至少立即想到)
返回您创建的与此作业相关的 ID。作业完成后,将具有该 ID 的结果保存到数据库中。然后,用户可以随时请求状态。
记下发送请求的用户,并在作业完成后向该用户发送电子邮件。这将需要更多的集成,但可以通过“Ping 每隔一段时间,我们会告诉你是否完成”获得更准确的结果。
这两种方法都是有效的,您甚至可以将两者结合起来(可能是两全其美的方法,因此您可以保存结果并在完成时提醒用户)。
推荐阅读
- c# - fastreport 根据数据隐藏 DataBand 中的元素
- tidb - TiDB 中的 mysql-safe 模式或类似的东西
- c - CMakeLists.txt 访问 GSL 库 C
- python - 如何在 python 中将复杂函数转换为 lambda?
- azure-devops - VS402864:找不到对应于 id PipelineArtifact 的工件类型
- javascript - 在 php 项目中使用 vue-cli 输出?
- swift4.1 - 无法打开文件,因为您无权查看它在呈现 UIVideoEditorController 时出现错误
- java - 无法删除目录:F:\AS_Pro\Grocehop\app\build\intermediates\classes\debug\android\support\graphics\drawable\animated
- xml - 使用 apache camel 在 mybatis 中选择对象列表
- scala - Akka 和期货的同时请求太多