我试图让 Bull 运行一些作业并运行设置,但出现超时错误
ERROR [ExceptionsHandler] Reached the max retries per request limit (which is 20). Refer to "maxRetriesPerRequest" option for details.
所以我已经设置了app.module
BullModule.forRootAsync({
useFactory: () => ({
redis: {
host: 'localhost',
port: 6379,
},
prefix: 'bull-queue',
maxRetriesPerRequest: 3,
defaultJobOptions: {
attempts: 3,
removeOnComplete: false,
backoff: {
type: 'exponential',
delay: 1000,
},
},
}),
}),
然后我设置了一个消费者
import { Job } from 'bull';
import { Process, Processor } from '@nestjs/bull';
@Processor('code')
export class CodeConsumer {
@Process('code-job')
handleTranscode(job: Job) {
console.log('Start audio compress into mp3...');
console.log(job.data);
console.log('completed!!');
}
}
我的资产代码模块注册队列
import { Module } from '@nestjs/common';
import { AssetCodesService } from './asset-codes.service';
import { AssetCodesController } from './asset-codes.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AssetCode } from './entities/asset-code.entity';
import { BullModule } from '@nestjs/bull';
import { CodeConsumer } from './consumers/qrcode.consumer';
@Module({
imports: [
TypeOrmModule.forFeature([AssetCode]),
BullModule.registerQueueAsync({
name: 'code',
}),
],
controllers: [AssetCodesController],
providers: [AssetCodesService, CodeConsumer],
})
export class AssetCodesModule {}
最后我的控制器注入队列并使用它来创建作业
constructor(
private readonly assetCodesService: AssetCodesService,
@InjectQueue('code') private codeQueue: Queue,
) {}
@Post('create')
async startJob() {
console.log(this.codeQueue.client.status);
await this.codeQueue.add('code-job', {
foo: 'bar',
});
}
控制器功能中的状态日志给我一条“正在重新连接”的消息
原因可能是因为你的redis没有在本地机器上初始化。如果您在云中使用 Redis,请记住您不应输入 Redis 主机的完整路径,即:您应该仅对 url 进行着色,不带“redis://”,也不带端口结束。您只需将主机以及端口和密码放入其他变量中即可。