Я читаю раздел Иностранные источники, управляемые событиями , содержащие это:
В некоторых случаях фактический источник данных может поступать из внешней системы, которая не является Связующее. Например, источником данных может быть конечная точка 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