Intereting Posts
Kotlin: Разница между объектом и сопутствующим объектом в классе Перенос файлов Java в Kotlin в Android Studio В Vertx мне нужно перенаправить все HTTP-запросы на один и тот же URL-адрес, но для HTTPS Получать размер процентного содержания Guideline в пикселях Как установить прослушиватель движения для существующего вида Kotlin Dokka – Не удается найти задачу Dokka в андроид-студии Являются ли неправильные типы Котлина для примитивов на JVM? Функция-член не может использоваться как аргумент Как загрузить файл в Kotlin REPL Лучший способ обработки возвратов в предикате Как запустить искру java с Kotlin из командной строки kotlin получает подписчика для наблюдения наблюдаемого с помощью RxJava2 Почему Kotlin получает такое UndeclaredThrowableException, а не исключение ParseException? Измените фильтр цветного элемента элемента навигации и измените изображение, которое использует одинаковый идентификатор изображения Почему существует NoClassDefFoundError с классом, который существует?

Kotlin & Vertx & Mongo: Как управлять функциями async CRUD?

Друзья! Я – зеленая рука Веркса и Монго, теперь я столкнулся с трудной проблемой. Ниже приведены фрагменты кода.

Вот класс оболочки Mongo Client.

// MongoDatabase.kt import io.vertx.core.json.JsonObject import io.vertx.core.logging.LoggerFactory import io.vertx.kotlin.core.json.JsonObject import io.vertx.rxjava.core.Vertx import io.vertx.rxjava.ext.mongo.MongoClient import kotlin.reflect.KClass import kotlin.reflect.full.declaredFunctions class MongoDatabase<T: Any> (val tClass: KClass<T>, vertx: Vertx, config: JsonObject, databaseName: String) : Database<T> { private val mongo = MongoClient.createShared(vertx, config, databaseName) private val logger = LoggerFactory.getLogger(MongoDatabase::class.java) // I use a self-made annotation to record the mongo collection name private val tableName = (tClass.annotations.find { it is Entity } as Entity).tableName companion object { inline fun<reified T: Any> getInstance(vertx: Vertx, config: JsonObject, databaseName: String): Database<T> = MongoDatabase(T::class, vertx, config, databaseName) } private fun toJsonObject(element: T): JsonObject { return tClass.declaredFunctions.find { it.name == "toJsonObject" }!!.call(element) as JsonObject } suspend override fun create(element: T): T? { var isSucceed = false mongo.rxInsert(tableName, toJsonObject(element)) .doOnError { logger.error("$tableName insert failed: ${it.message}") } .subscribe { logger.info("$tableName insert succeed: $it"); isSucceed = true } return if (isSucceed) element else null } suspend override fun delete( id: String): Boolean { var isSucceed = false mongo.rxFindOneAndDelete(tableName, JsonObject("_id" to id)) .doOnError { logger.error("$tableName delete failed: ${it.message}") } .subscribe { logger.info("$tableName delete succeed: $it"); isSucceed = true } return isSucceed } suspend override fun update(id:String, element: T): T? { var isSucceed = false mongo.rxUpdate(tableName, JsonObject("_id" to id), toJsonObject(element)) .doOnError { logger.error("$tableName insert failed: ${it.message}") } .subscribe { logger.info("$tableName insert succeed: $it"); isSucceed = true } return if (isSucceed) element else null } // No implementation yet. suspend override fun get(pair: Pair<String, Any>): List<T> { return emptyList() } } 

Вот код вертиляции.

 package com.ra import io.reactivex.rxkotlin.subscribeBy import io.reactivex.rxkotlin.toObservable import io.vertx.core.logging.LoggerFactory import io.vertx.kotlin.core.json.JsonObject import io.vertx.rxjava.core.AbstractVerticle import kotlinx.coroutines.experimental.async import kotlinx.coroutines.experimental.runBlocking import java.time.LocalDateTime import java.util.* class MainVerticle : AbstractVerticle() { private val logger = LoggerFactory.getLogger(MainVerticle::class.java) private lateinit var database: Database<Article> override fun start() = runBlocking<Unit> { database = MongoDatabase.getInstance(vertx, JsonObject(), "Main Pool") val datas = listOf( Article(UUID.randomUUID().toString(), "title1", listOf("tag1", "tag2"), LocalDateTime.of(2018, 1, 1, 0, 0, 0), "content"), Article(UUID.randomUUID().toString(), "title2", listOf("tag1", "tag2"), LocalDateTime.of(2018, 1, 1, 0, 0, 0), "content"), Article(UUID.randomUUID().toString(), "title3", listOf("tag1", "tag2"), LocalDateTime.of(2018, 1, 1, 0, 0, 0), "content") ) datas.toObservable() .subscribeBy( onError = { it.printStackTrace() }, onNext = { async { database.create(it) } }, onComplete = { logger.info("datas creation complete!") }) /** * Jan 10, 2018 10:35:57 AM com.ra.MongoDatabase * INFO: article delete succeed: null * Jan 10, 2018 10:35:58 AM com.ra.MongoDatabase * INFO: article insert succeed: null * Jan 10, 2018 10:35:58 AM com.ra.MongoDatabase * INFO: article insert succeed: null * Jan 10, 2018 10:35:58 AM com.ra.MongoDatabase * INFO: article insert succeed: null */ datas.forEach { database.create(it) } /** * Jan 10, 2018 10:32:56 AM com.ra.MongoDatabase * INFO: article delete succeed: null * Jan 10, 2018 10:32:56 AM com.ra.MongoDatabase * INFO: article insert succeed: null * Jan 10, 2018 10:32:56 AM com.ra.MongoDatabase * INFO: article insert succeed: null * Jan 10, 2018 10:32:56 AM com.ra.MongoDatabase * INFO: article insert succeed: null **/ database.delete(datas[1]._id) } } 

И, как вы можете видеть,

  1. результат полностью неправильный – сначала он удалил и вставлял.
  2. Конечно, результат в Mongodb также неверен – он вообще ничего не удаляет.
  3. Хуже того, результат в журнале не имеет значения, но я не знаю, почему …

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

Итак, вот мои вопросы:

  1. Почему мой код не так?
  2. Как управлять асинхронными функциями? Например, я хочу (добавить три статьи) => (Обновить статью, где id = 1) || (Удалить статью, где id = 0), как я могу использовать kotlin-coroutine или rxjava для ее решения?

PS: || означает вместе

Solutions Collecting From Web of "Kotlin & Vertx & Mongo: Как управлять функциями async CRUD?"