Постановка задачи в 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 считает
обработанные задачи в поле класса.