Spring Webflux Mono: невозможно собрать результаты в виде списка - PullRequest
0 голосов
/ 31 октября 2019

Я использую Spring Webflux, чтобы использовать друг друга, и пытаюсь объединить результаты в список для различных комбинаций ввода. Но застрял в одной точке, где я не смог подписаться и преобразовать результаты в Список

  1. . Этот метод возьмет карту и перебирает карту и вызывает другой сервис с различными комбинациями ввода.
    Но в getAPrice () не удалось выполнить то, что я хочу: (

    Ввод:

     public Mono<List<APrice>> getAPrice() {
            return
                    Mono.create(monoSink ->{
                         getActiveMonths()
                                .entrySet().stream()
                                .flatMap(e->getContractPrice(e.getKey(),e.getValue())
                                /* stuck here, don't have any idea how to subccribe and get the AP Object and collect it as a list */
                    });
        } 
    

    Вывод:

    expected : List[APrice]    
    
  2. Выше getAPrice () вызывает приведенный ниже метод, который работает нормально и возвращает данные для допустимых комбинаций ввода

    Ввод:

     /*Method is Working fine and returns a Mono<APrice> for the right input combination */
    public Mono<APrice> getContractPrice(String key, String value){
        return Mono.create(monoSink ->{
            acServiceWebClient.getPrice(key,value) 
                    .subscribe(aPrice ->  monoSink.success(aPrice),
                            error->{
                                monoSink.error(error);
                            });
        });
    }
    

    Вывод:

    {
    "id": 11,
    "curveName": "NT",
    "Month": "Mar 2010",
    "price": 160.17,
    "status": "ACTIVE"
    }
    
    private Map<String,String> getActiveMonths()
    {
        Map hm = new HashMap();
        hm.put("key1","value1")
        hm.put("key2","value2")
        return hm;
    }

Будем рады получить несколько советов о том, как лучше выполнить getAPrice (), также будет полезно исправить меня, если я буду следовать неправильному подходу. Спасибо

1 Ответ

0 голосов
/ 31 октября 2019

Вам на самом деле не нужно MonoSink для вашей работы. Что вы можете сделать, это создать Flux из вашего getActiveMonths entrySet и затем вызвать метод getActivePrice с этими entrySet 'key & value. Итак, ваш getAPrice на самом деле должен выглядеть так:

public Mono<List<APrice>> getAPrice() {

    return Flux.fromIterable(getActiveMonths().entrySet())
        .flatMap(entry -> getContractPrice(entry.getKey(), entry.getValue())).collectList();
}

Есть две причины, чтобы просто создать Flux здесь.

  1. У вас нет оснований для создания последовательности программно (для которой в основном используются MonoSink или FluxSink). У вас есть данные, и вам просто нужно использовать их без каких-либо манипуляций.

  2. У вас действительно есть коллекция, и вы хотите использовать каждую ее запись, что делает ее хорошим кандидатом на рольиспользуется в Flux (0-n элементов) вместо Mono (0-1 элементов).

См. Эту официальную документацию Project Reactor , которая вносит ясность и подтверждает мою точку зрения.

Если getContractPrice возвращает Mono<List<APrice>>? Вот как getAPrice должен выглядеть

public Mono<List<APrice>> getAPrice() {

    return Flux.fromIterable(getActiveMonths().entrySet())
        .flatMap(entry -> getContractPrice(entry.getKey(), entry.getValue()))
        .flatMapIterable(aPrices -> aPrices).collectList();
}
...