Каким должен быть жизненный цикл MongoClient afMongo?

На основе примера afMongo я сейчас делаю это:

mongoClient := MongoClient(ActorPool(), `mongodb://localhost:27017`)
collection  := mongoClient.db("mydb").collection("mycollection")
...
// inserts or queries here
...
mongoClient.shutdown

Насколько я понимаю, MongoClient использует пул соединений. Если это правильно, то я полагаю, что могу использовать MongoClient во всех моих DAO и выключать его только при закрытии приложения afBedSheet.

  1. Это предположение верно?
  2. Как я могу подключить завершение MongoClient к выключению afBedSheet, пожалуйста?

1 ответ

Решение
  1. Да. Вам нужен только один MongoClient,
  2. Используйте сервис RegistryShutdown. Когда простыня закрывается, она также выключает реестр IoC.

Я бы ConnectionManager как услуга, и закройте это. Так в вашем AppModule:

@Build
static ConnectionManager buildConnectionManager() {
    ConnectionManagerPooled(ActorPool(), `mongodb://localhost:27017`)
}

@Contribute { serviceType=RegistryShutdown# }
static Void contributeRegistryShutdown(Configuration config, ConnectionManager conMgr) {
    config.add(|->| { conMgr.shutdown } )
}

MongoClient также может быть услуга.

Вы также можете переписать вышесказанное, чтобы быть немного более правильным. Я склонен использовать ActorPools сервис, чтобы следить за ними.

static Void bind(ServiceBinder binder) {
    binder.bind(MongoClient#)
}

@Build { serviceId="afMongo::ConnectionManager" }
static ConnectionManager buildConnectionManager(ConfigSource configSrc, ActorPools actorPools) {
    actorPool := actorPools.get("myPod.connectionManager")
    return ConnectionManagerPooled(actorPool , `mongodb://localhost:27017`)
}

@Contribute { serviceType=ActorPools# }
static Void contributeActorPools(Configuration config) {
    config["myPod.connectionManager"] = ActorPool() { it.name = "myPod.connectionManager"; it.maxThreads = 1 }
}

@Contribute { serviceType=RegistryShutdown# }
static Void contributeRegistryShutdown(Configuration config, ConnectionManager conMgr) {
    config["myPod.closeConnections"] = |->| {
        conMgr.shutdown
    }
}

myPod.closeConnections это просто произвольное имя, и в этом примере оно больше нигде не используется.

Но вы можете использовать его, чтобы переопределить или удалить вклад. Некоторые будущие тестовые сценарии могут добавить MyTestAppModule со следующим:

@Contribute { serviceType=RegistryShutdown# }
static Void contributeRegistryShutdown(Configuration config) {
    config.remove("myPod.closeConnections")
}

Вероятно, не полезно в данном конкретном случае, но полезно знать о.

Другие вопросы по тегам