Spring reactive с динамическими производителями

java #spring #reactive

#java #spring #реактивный

Вопрос:

Я быстро начал использовать реактивное мышление вместе с java и Spring.

Возможно ли создать сценарий, в котором у вас есть динамическое количество производителей? Я разрабатываю продукт, который прослушивает определенное оборудование для событий, и было бы здорово, если бы я мог добавить (и, возможно, удалить) динамическое прослушивание устройств A, B … Z без завершения потока.

Я представляю себе что-то вроде:

 @GetMapping("/")
public Flux<HardwareEvent> void test() {
  return Flux.merge(
    listenHardware(A),
    listenHardware(B)
  );
}

Flux<HardwareEvent> listenHardware(HardwareId id); // produced indefinite stream of events
 

Где вы каким-то образом могли бы динамически вводить новых производителей в слияние, не останавливая поток.

Возможно ли это?

Если бы кто-нибудь мог указать мне (или опубликовать) пример, это было бы потрясающе. С уважением.

Ответ №1:

Возможно, вам понадобится некоторый код склеивания в середине, но это выглядит как хороший вариант использования для субъектов

Вместо того, чтобы иметь «обычный» Observable , у вас будет Subject то, что вы видите как наблюдаемое. Хорошая особенность Subject s в том, что вы можете создавать новые значения по требованию, чтобы вы могли сделать что-то вроде

 Subject<Value> s = ...;
Observable<Value> getObservable() {
  return s;
}

void addSource(Observable<Value> obs) {
  obs.subscribe(v -> s.emit(s))
}
 

Обратите внимание, что это псевдокод и, вероятно, не будет компилироваться как есть

Взгляните на Subject документы, чтобы узнать, какой из них лучше соответствует вашим потребностям

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

1. Интересно, однако я не уверен, что Springs flavor of reactive поддерживает темы, или, может быть, он просто назвал что-то другое (тема немного сложна для Google ;))

2. Вот почему я включил ссылки на документацию. Spring webflux также поддерживает RxJava

3. о — ок, извините, я этого не знал. Как я понял, я реактивный новичок. В любом случае спасибо за ваше время 🙂