Add pg-boss worker poc (#2991)
* Add pg-boss worker poc * add Example job * add retry limit * rename MessageQueue
This commit is contained in:
@ -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 {}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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()}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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 {}
|
||||
@ -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,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user