Я работал с некоторым Reactor Core Java, потому что я хочу выяснить, возможно ли это решить одну проблему, которая у меня есть на данный момент при использовании этой инфраструктуры.
В настоящее время у меня долгая, выполняемая работа, которая занимает около 40-50 минут. Метод выглядит примерно так:
public void doLongTask(List<Something> list){
//instructions.
for(Something sm : list){
if(condition){
executeLongOperation();
}
//instructions
if(condition){
executeLongOperation();
}
}
}
в моем контроллере у меня есть что-то вроде этого:
@GetMapping(path = "/integersReactor", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
public Flux<Integer> getIntegersReactor(){
logger.debug("Request getIntegersReactor initialized.");
return simpleSearchService.getIntegersReactor();
}
и в слое обслуживания у меня есть что-то вроде этого:
@Override
public Flux<Integer> getIntegersReactor(){
return Flux.range(0, Integer.MAX_VALUE);
}
это просто заполнитель, который я использую в качестве доказательства концепции. Мои настоящие намерения состоят в том, чтобы как-то вернуть поток некоторого объекта, который я сам определю, у этого объекта будет несколько полей, которые я буду использовать, чтобы сообщить потребителю статус задания.
Теперь все становится несколько сложнее, потому что я хотел бы отправлять обновления как executeLongOperation (); выполняются, и каким-то образом вместо возврата потока целых чисел возвращают поток объекта, который использует возврат executeLongOperation ();
Может ли это быть достигнуто с Flux? Как я могу использовать Java Reactor Core, чтобы выдавать возвращаемые значения за все время executeLongOperation (); выполняется в реактивный поток, который может быть передан в контроллер так же, как это делает метод getIntegersReactor () в моем примере?