РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpQuEn 101 of 201 menu
◀ ▶

Постановка задачи в Nest

Очередь настроена, но после сохранения строки в памяти ничего не попадает в Redis. Тяжёлый шаг по-прежнему мог бы выполняться в том же методе, хотя его уже можно отложить.

Сервис получает очередь через конструктор с пометкой внедрения по имени регистрации. После успешной записи он ставит задачу с коротким именем на латинице. Чтобы запись не зависала, рядом регистрируют класс обработчика: он наследует WorkerHost и забирает задачи из той же очереди.

Покажем на примере постов:

import { Module } from '@nestjs/common'; import { BullModule } from '@nestjs/bullmq'; import { PostController } from './post.controller.js'; import { PostProcessor } from './post.processor.js'; import { PostService } from './post.service.js'; @Module({ imports: [ BullModule.forRoot({ connection: { host: 'localhost', port: 6379, }, }), BullModule.registerQueue({ name: 'posts', }), ], controllers: [PostController], providers: [PostService, PostProcessor], }) export class AppModule {}

Сервис сохраняет заголовок и сразу ставит задачу:

import { Injectable } from '@nestjs/common'; import { InjectQueue } from '@nestjs/bullmq'; import { Queue } from 'bullmq'; @Injectable() export class PostService { posts: { title: string }[] = []; postQueue: Queue; constructor(@InjectQueue('posts') postQueue: Queue) { this.postQueue = postQueue; } async create(title: string) { const post = { title }; this.posts.push(post); await this.postQueue.add('post-created', {}); return post; } }

Обработчик связан с очередью posts и увеличивает счётчик в поле класса, когда задача доходит до него:

import { Processor, WorkerHost } from '@nestjs/bullmq'; import { Job } from 'bullmq'; @Processor('posts') export class PostProcessor extends WorkerHost { handledCount = 0; async process(job: Job) { this.handledCount += 1; } }

Контроллер принимает заголовок и отдаёт результат сохранения:

import { Body, Controller, Post } from '@nestjs/common'; import { PostService } from './post.service.js'; @Controller('posts') export class PostController { postService: PostService; constructor(postService: PostService) { this.postService = postService; } @Post() create(@Body('title') title: string) { return this.postService.create(title); } }

После добавления записи в память WorkerService ставит задачу, а WorkerProcessor считает обработанные задачи в поле класса.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить