Обеспечение выполнения метода в Spring Webflux - PullRequest
0 голосов
/ 08 марта 2020
override fun uploadFileAndNotifyCadmium(
        validatedPages: List<KycFile>,
        documentId: UUID,
    ): Mono<Unit> {

        validatedPages.forEach { it ->
            s3Service.uploadToToxicBucket(
                documentId, it.fileName })
                .then()
        }

        return cadmiumClient.notifyCadmium(documentId) // API call to other microservice
    }

У меня есть этот метод, где я пытаюсь вызвать метод (s3Service.uploadToToxicBucket()), который возвращает Mono of Unit при повторении списка. Я хочу убедиться, что этот метод вызывается для каждого из элементов списка. Поэтому я добавил затем () к полученному моно. Также я хочу, чтобы метод cadmiumClient.notifyCadmium() выполнялся только после загрузки всех файлов. Это правильный способ сделать это или я могу использовать какой-то другой оператор. cadmiumClient.notifyCadmium () также возвращает Mono of Unit.

Также я звоню uploadFileAndNotifyCadmium().then(), когда звоню uploadFileAndNotifyCadmium().

Я использую then (), потому что выполнение ленивый, и я не хочу вызывать subscribe () для проверки выполнения этих методов. Также в контроллере вызывается метод uploadFileAndNotifyCadmium (), поэтому он автоматически подписывается Spring Webflux. Мое понимание относительно использования then () может быть неправильным.

Подход 2: Я также думал о том, чтобы сделать это:

override fun uploadFileAndNotifyCadmium(
        validatedPages: List<KycFile>,
        documentId: UUID,
    ): Mono<Unit> {

        val list = mutableListOf<Mono<Unit>>()

        validatedPages.forEach { it ->
            val result =s3Service.uploadToToxicBucket(
                documentId, it.fileName })

        list.add(result)

        }

        //Zip all the elements in list together into some variable zippedResult

        return zippedResult.then(cadmiumClient.notifyCadmium(documentId)) // API call to other microservice
    }

Для этого подхода я не могу найти ни одного оператора для zip все элементы вместе, когда размер списка неизвестен.

1 Ответ

0 голосов
/ 08 марта 2020

Я пытаюсь понять, что вы хотите сделать, потому что ваше объяснение совершенно неясно.

Я не кодирую в Kotlin, но если я правильно понял, что вы хотите сделать is:

  • Взять в список из n объектов
  • выполнить какой-либо побочный эффект для каждого объекта в списке
  • собрать некоторую форму результата из всех побочных эффектов
  • вернуть этот результат

это то, как я бы сделал это простым реактивным java

    return Flux.fromIterable(List.of("one", "two", "three"))
            .flatMap( // do some side effect )
            .collect(Collectors.toList());
  • Конвертировать список Flux<T>
  • Выполнить побочный эффект в flatMap для каждого испускаемого элемента
  • Собрать все результаты в виде списка
  • вернуть Mono<List<T>>
...