#typescript #nestjs #scheduler
#машинописный текст #nestjs #планировщик
Вопрос:
Я пытаюсь создать «worker» для NestJS, который в основном объединяет данные из нескольких источников данных. Поскольку я развертываю этого работника в кластере Kubernetes, мне не нужно запускать внутренний HTTP-сервер NestJS, однако планировщик не запускается без app.listen
него.
main.ts:
async function bootstrap() {
const app = await NestFactory.create(WorkerModule);
await app.listen(3030); // <-- I would like to delete this
}
bootstrap();
рабочий.модуль.ts
@Module({
imports: [
ScheduleModule.forRoot(),
],
providers: [
// Scrappers
DataScrapper,
],
})
export class WorkerModule {}
данных.Дуэлянт.ц
@Injectable()
export class DataScrapper {
@Interval(1000)
async sync() {
console.log('fetching...');
}
}
Ответ №1:
По своей сути, NestJS представляет собой модульную структуру, которая обеспечивает мощные возможности DI для экосистемы node / TS. Модуль верхнего уровня может быть предоставлен одним из трех способов:
- HTTP-сервер
- Микросервис
- Контекст приложения, например, загрузочный контейнер DI
Вы можете добиться желаемого, создав свое приложение как микросервис с пользовательской стратегией. Я, скорее всего, упакую этот шаблон как часть экосистемы @golevelup / nestjs (отказ от ответственности, я автор), поскольку в последнее время я все чаще сталкиваюсь с этим шаблоном.
import { CustomTransportStrategy } from '@nestjs/microservices';
class KeepAliveStrategy implements CustomTransportStrategy {
private closing = false;
wait() {
if (!this.closing) {
setTimeout(this.wait, 1000);
}
}
listen(callback: () => void) {
callback();
this.wait();
}
close() {
this.closing = true;
}
}
async function bootstrap() {
const workerApp = await NestFactory.createMicroservice(WorkerModule, {
strategy: KeepAliveStrategy,
});
await workerApp.listen(() => console.log('listening'));
}
bootstrap();
Это сохранит ваш рабочий ресурс и позволит ему правильно реагировать на события жизненного цикла NestJS
Комментарии:
1.Я обнаружил две проблемы:
typescript const app = await NestFactory.createMicroservice(WorkerModule, { strategy: new KeepAliveStrategy(), // new() is required });
typescript wait() { if (!this.closing) { setTimeout(() => this.wait(), 1000); // should be () => this.wait() } }