Add pg-boss worker poc (#2991)

* Add pg-boss worker poc

* add Example job

* add retry limit

* rename MessageQueue
This commit is contained in:
Weiko
2023-12-14 18:57:25 +01:00
committed by GitHub
parent 468744298b
commit 36164ab59b
18 changed files with 196 additions and 41 deletions

View File

@ -1,9 +1,10 @@
import { Module } from '@nestjs/common';
import { FetchWorkspaceMessagesCommand } from 'src/workspace/messaging/commands/fetch-workspace-messages.command';
import { MessagingModule } from 'src/workspace/messaging/messaging.module';
@Module({
imports: [],
imports: [MessagingModule],
providers: [FetchWorkspaceMessagesCommand],
})
export class FetchWorkspaceMessagesCommandsModule {}

View File

@ -1,5 +1,7 @@
import { Command, CommandRunner, Option } from 'nest-commander';
import { MessagingProducer } from 'src/workspace/messaging/producers/messaging-producer';
interface FetchWorkspaceMessagesOptions {
workspaceId: string;
}
@ -9,11 +11,18 @@ interface FetchWorkspaceMessagesOptions {
description: 'Fetch messages of all workspaceMembers in a workspace.',
})
export class FetchWorkspaceMessagesCommand extends CommandRunner {
constructor(private readonly messagingProducer: MessagingProducer) {
super();
}
async run(
_passedParam: string[],
options: FetchWorkspaceMessagesOptions,
): Promise<void> {
console.log('fetching messages for workspace', options.workspaceId);
await this.messagingProducer.enqueueFetchMessages(
{ workspaceId: options.workspaceId },
options.workspaceId,
);
return;
}

View File

@ -0,0 +1,22 @@
import { Injectable } from '@nestjs/common';
import { MessageQueueJob } from 'src/integrations/message-queue/interfaces/message-queue-job.interface';
import { EnvironmentService } from 'src/integrations/environment/environment.service';
export type FetchMessagesJobData = {
workspaceId: string;
};
@Injectable()
export class FetchMessagesJob implements MessageQueueJob<FetchMessagesJobData> {
constructor(private readonly environmentService: EnvironmentService) {}
async handle(data: FetchMessagesJobData): Promise<void> {
console.log(
`fetching messages for workspace ${
data.workspaceId
} with ${this.environmentService.getMessageQueueDriverType()}`,
);
}
}

View File

@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { MessagingProducer } from 'src/workspace/messaging/producers/messaging-producer';
@Module({
imports: [],
providers: [MessagingProducer],
exports: [MessagingProducer],
})
export class MessagingModule {}

View File

@ -0,0 +1,27 @@
import { Inject, Injectable } from '@nestjs/common';
import { MessageQueue } from 'src/integrations/message-queue/message-queue.constants';
import { MessageQueueService } from 'src/integrations/message-queue/services/message-queue.service';
import {
FetchMessagesJob,
FetchMessagesJobData,
} from 'src/workspace/messaging/jobs/fetch-messages.job';
@Injectable()
export class MessagingProducer {
constructor(
@Inject(MessageQueue.messagingQueue)
private readonly messageQueueService: MessageQueueService,
) {}
async enqueueFetchMessages(data: FetchMessagesJobData, singletonKey: string) {
await this.messageQueueService.add<FetchMessagesJobData>(
FetchMessagesJob.name,
data,
{
id: singletonKey,
retryLimit: 2,
},
);
}
}