我尝试在nest.js中使用BullQueue包实现一个队列。我有两个队列,一个是文件队列,另一个是电子邮件队列。
在缩略图上传后,我使用文件队列在后台重新生成缩略图。电子邮件队列发送电子邮件。问题是我的文件队列工作得很好,但我创建的电子邮件队列给我的结果不一致。有时作业会被@Process('JobName')
函数拾取,有时不会。
更重要的是,我注意到当问题发生时,我试图删除dist文件夹并重新启动服务器,重新生成dist目录。它工作,直到它没有经过几次试验。
这是我的文件夹结构。
my-nest-app/
├─ src/
│ ├─ bull-queue/
│ │ ├─ bull-queue.module.ts
│ │ ├─ file-queue/
│ │ │ ├─ file-queue-producer.service.ts
│ │ │ ├─ file-queue-consumer.service.ts
│ │ ├─ email-queue/
│ │ │ ├─ email-producer.service.ts
│ │ │ ├─ email-processor.service.ts
字符串
bull-queue.module.ts
export enum BullQueue {
FileQueue = 'file-queue',
EmailQueue = 'email-queue',
}
@Global()
@Module({
imports: [
BullModule.forRoot({
redis: {
host: process.env.REDIS_HOST,
port: parseInt(process.env.REDIS_PORT) || 6379
}
}),
BullModule.registerQueue(
{ name: BullQueue.FileQueue },
{ name: BullQueue.EmailQueue }
),
ProjectModule,
FileModule
],
providers: [
BullQueueService,
FileQueueConsumerService,
FileQueueProducerService,
EmailProcessorService,
EmailProducerService
],
controllers: [],
exports: [FileQueueProducerService, EmailProducerService]
})
export class BullQueueModule {}
型
email-producer.service.ts
export enum EmailJobs {
PasswordReset = 'password_reset',
}
@Injectable()
export class EmailProducerService {
constructor(@InjectQueue(BullQueue.EmailQueue) private queue:Queue){}
async password_reset_email(payload: PasswordResetPayload){
await this.queue.add(EmailJobs.PasswordReset, payload);
}
}
型
email-processor.service.ts
@Processor(BullQueue.EmailQueue)
export class EmailProcessorService {
constructor(
private readonly loggerService: LoggerService,
private readonly helperService: HelperService
) {}
@Process(EmailJobs.PasswordReset)
async password_reset(job: Job<PasswordResetPayload>) {
console.log('password_reset Job Processor')
}
}
型
我想知道我是否违反了任何设计原则,或者这只是队列包管理器的问题。
1条答案
按热度按时间aoyhnmkz1#
他们忘了在文档中提到一件事。
处理器也需要添加到APP_PROVIDERS中。NestJS需要知道使用的对象。