функциональная привязка spring присваивает имена нескольким входам для одного вывода в spring cloud

#spring #spring-cloud-stream

#spring #spring-cloud-stream

Вопрос:

Как настроить несколько входных каналов для вывода в одно и то же место назначения

У меня следующая конфигурация:

 spring:
  cloud:
    stream:
      function:
        definition: beer;scotch
      bindings:
        notification:
          destination: labron
        beer-in-0:
          destination: wheat
        scotch-in-0:
          destination: wiskey
 

Я хочу создать привязку функции, чтобы каждый входной канал выводил привязку сообщения к уведомлению

Итак, в соответствующем коде:

 @Service
class Notifications {
  @Bean
  fun beer(): Function<String, String> = Function {
    // wanted oout channel
    // beer -> notification
    it.toUpperCase()
  }

  @Bean
  fun scotch(): Function<String, String> = Function {
    // wanted oout channel
    // scotch -> notification
    it.toUpperCase()
  }
 

}

Я хочу использовать имена функциональных привязок Spring Cloud Stream 3.0.

 beer -> notification
scotch -> notification
 

Каков наилучший способ активировать это?

Ответ №1:

Я бы предложил использовать что-то вроде этого (исходя из этого):

     @Bean
    public Function<Tuple2<Flux<String>, Flux<String>>, Flux<String>> beerAndScotch() {
        return tuple -> {
            Flux<String> beerStream = tuple.getT1().map(item -> item.toUpperCase());
            Flux<String> scotchStream = tuple.getT2().map(item -> item.toUpperCase());
            return Flux.merge(beerStream, scotchStream);
        };
    }
 

и поэтому ваше определение должно выглядеть примерно так:

 spring:
  cloud:
    stream:
      function:
        definition: beerAndScotch
      bindings:
        notification:
          destination: labron
        beerAndScotch-in-0:
          // ...
        beerAndScotch-in-1:
          // ...
        beerAndScotch-out-0:
          destination: labron
 

Таким образом, как входные данные beer , так и входные данные для scotch отправки labron

Комментарии:

1. 1 к @orrab. Просто хотел кое-что добавить. Если вы не хотите использовать реактивный подход, вы все равно можете сделать это с помощью своей первоначальной настройки. Все, что вам нужно, это сопоставить выходные привязки функций с одним и тем же местом назначения с помощью ...function.bindings... свойства. Например, spring.cloud.stream.function.bindings.scotch-out-0=notification и spring.cloud.stream.function.bindings.beer-out-0=notification . Подробнее об этом здесь