@Injectable()
export class SubmissionService implements OnModuleInit {
private readonly logger = new Logger(SubmissionService.name)
constructor(
private readonly prisma: PrismaService,
private readonly amqpConnection: AmqpConnection,
private readonly configService: ConfigService,
private readonly httpService: HttpService,
private readonly traceService: TraceService
) {}
onModuleInit() {
this.amqpConnection.createSubscriber(
async (msg: object) => {
try {
const res = await this.validateJudgerResponse(msg)
await this.handleJudgerMessage(res)
} catch (error) {
if (
Array.isArray(error) &&
error.every((e) => e instanceof ValidationError)
) {
this.logger.error(error, 'Message format error')
} else if (error instanceof UnprocessableDataException) {
this.logger.error(error, 'Iris exception')
} else {
this.logger.error(error, 'Unexpected error')
}
return new Nack()
}
},
{
exchange: EXCHANGE,
routingKey: RESULT_KEY,
queue: RESULT_QUEUE,
queueOptions: {
channel: CONSUME_CHANNEL
}
},
ORIGIN_HANDLER_NAME
)
}
onModuleInit
는 NestJS에서 모듈이 초기화될 때 호출되는 함수로, 이를 통해 하나의 Connection만 만든다. 그 이후, 연결된 amqpConnection을 사용하여
this.amqpConnection.publish(EXCHANGE, SUBMISSION_KEY, judgeRequest, {
messageId: String(submission.id),
persistent: true,
type: PUBLISH_TYPE
})
이런식으로 publish까지 한다. 따라서 모듈 초기화 시 맺었던 하나의 Connection에서 통신이 이루어진다.
싱글톤처럼 사용된다는 뜻이다.