Vertx список вызовов Rest API в цикле - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в среде vertx и Java. Код ниже вызывает список конечных точек API для отдыха и сохраняет результаты в MongoDB, и он работает, но я не уверен, что это правильный способ сделать это в среде vertx. Кроме того, есть ли какие-то улучшения?

     val deviceRepository = listOf("10.2.0.106",
                "10.2.0.120",
                "10.2.0.115",
                "10.2.0.112",
                "10.2.0.118",
                "10.2.0.119")

        internal class DeviceListVerticle : AbstractVerticle() {
            @OptIn(UnstableDefault::class)
            @ImplicitReflectionSerializer
            override fun start() {
        // mongo client connection
                val config = mapOf(Pair("db_name", "deviceList"), Pair("connection_string", "mongodb://localhost:27017"))
                val mongoClient: MongoClient = MongoClient.create(vertx, JsonObject(config))

                val httpClient = WebClient.create(vertx)
       // loop through each IP address in deviceRepository and call rest end point http://{IP}/information/device
                deviceRepository.forEach { deviceIP ->
                    val request: HttpRequest<Buffer> = httpClient.get(deviceIP, "information/device")
                    request.send { ar ->
                        if (ar.succeeded()) {
                            // Obtain response
                            val response = ar.result()
                            mongoClient.save("devices", response.bodyAsJsonObject()) { res ->
                                if (res.succeeded()) {
                                    val id: String = res.result()
                                    println("Saved device with id $id")
                                } else {
                                    res.cause().printStackTrace()
                                }
                            }
                        } else {
                            println("Something went wrong " + ar.cause().message)
                        }
                    }
                }
            }

            override fun stop() {
                println("DeviceListVerticle stopped")
            }
        }

        fun main() {
            val vertx = Vertx.vertx()
            vertx.deployVerticle(DeviceListVerticle())
        }

1 Ответ

0 голосов
/ 18 июня 2020

Для одноразовой задачи, я думаю, лучше использовать WebClient без Verticle. Я думаю, что вертикали хорошо подходят для инкапсуляции реактивных вычислений (например, обслуживание запросов, период c выполнение) в пакеты, удобные для параллелизма и развертывания.

...