Требуется ли для MikroORM RequestContext при использовании с фоновыми рабочими, такими как BullMQ?

#mikro-orm #bullmq

#mikro-orm #bullmq

Вопрос:

Я использую MikroORM с рабочими BullMQ. Когда MikroORM используется с приложениями Express, ему требуется RequestContext, чтобы поддерживать уникальные идентификационные карты для каждого запроса. Я подозреваю, что то же самое требуется при обработке нескольких заданий одним и тем же работником BullMQ.

Кто-нибудь еще успешно объединил эти две библиотеки? Возможно ли автоматически разветвлять диспетчер сущностей, когда работник начинает новое задание?

Ответ №1:

@UseRequestContext() Для таких случаев вы можете использовать декоратор. В основном это будет действовать так, как если бы метод выполнялся после промежуточного программного обеспечения, которое добавляет контекст. Обратите внимание, что для его использования this.orm должен быть MikroORM экземпляр.

 @Injectable()
export class MyService {

  constructor(private readonly orm: MikroORM) { }

  @UseRequestContext()
  async doSomething() {
    // this will be executed in a separate context
  }

}
 

https://mikro-orm.io/docs/usage-with-nestjs/#request-scoped-handlers-in-queues

(эта часть документации посвящена nestjs, но это та же проблема с тем же решением)

В качестве альтернативы вы могли бы использовать RequestContext.createAsync() явно:

 await RequestContext.createAsync(orm.em, async () => {
  // orm.em here will use the contextual fork created just for this handler
});