EmitterProcessor, производитель должен быть в одном потоке? - PullRequest
0 голосов
/ 08 февраля 2020

Я читаю раздел Иностранные источники, управляемые событиями , содержащие это:

В некоторых случаях фактический источник данных может поступать из внешней системы, которая не является Связующее. Например, источником данных может быть конечная точка web-класса classi c. Как связать такой источник с функциональным поставщиком?

Давайте рассмотрим простой пример:

@SpringBootApplication
@Controller
public class WebSourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebSourceApplication.class);
    }

    EmitterProcessor<String> processor = EmitterProcessor.create();

    @RequestMapping
    @ResponseStatus(HttpStatus.ACCEPTED)
    public void delegateToSupplier(@RequestBody String body) {
        processor.onNext(body); // produces messages on many Thread(s)
    }

    @Bean
    public Supplier<Flux<String>> supplier() {
        return () -> processor;
    }
}

Меня поразил вызов processor.onNext, который находится в @Controller метод, который наиболее вероятно выполняется множественными потоками. Хотя EmitterProcessor не накладывает никаких особых ограничений на потоки производителей, каким-то образом связанный процессор DirectProcessor подчеркивает это требование:

все производители должны создавать сообщения в одном потоке, иначе Reactive Streams Spe c контракт нарушен

Так почему в приведенном выше примере Reactive Streams Spe c контракт также не будет нарушен, учитывая, что многие потоки могут выполнить метод delegateToSupplier

...