@Async с циклом for веснойJAVA

Программисты JAVA общаются здесь
Anonymous
@Async с циклом for весной

Сообщение Anonymous »

У меня следующий сценарий.
  • есть своего рода ежедневный расчет, который можно выполнить задним числом по месяцам.
  • это отнимает очень много времени, требует большого количества вычислений.
  • ни один день не зависит от результата другого дня, каждый день автономен.
  • вычисления будут запускаться из веб-API.
  • все результаты будут сохранены для дальнейшего использования.
  • все методы недействительны. >
Итак, я подумал о цикле for, который будет рассчитывать несколько дней за раз, поскольку нет необходимости знать результаты других дней, но я не могу понять, как это сделать правильно.

куда мне поместить аннотацию @Async?

метод для JAX следующий:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/calculated")
public void calculated(String req,
final @Context SecurityContext securityContext,
final @Suspended AsyncResponse response2) {

logger.info("calculating");
ThymeDate thymeDate = parseJSONDate(req);

thymeNewDateRange.getDataForDateRange(thymeDate, null);

}


это отправит объект с датой a и датой b в метод getDataForDateRange, который затем будет зацикливать дни между a и b.

public void iterateOverDays(ThymeDate thymeDate) {
for (LocalDate date : new DateRange(thymeDate.getDate_a(), thymeDate.getDate_b())) {
ControlService.dailyCalculation(date, null);
}


и, как уже говорилось ранее, метод dailyCalculation огромен, поэтому я не буду вставлять для него код, но это пустой метод со множеством вычислений.

Я пытался поместить @Async в метод dailyCalculation, но приложение начало пропускать дни и выполнять несколько вычислений в некоторые дни, по-видимому, случайным образом.

Я также пытался поместить его в JAX и метод цикла for, что привело к тому, что асинхронность вообще не использовалась.

В моей конфигурации приложения есть следующий Executor:

@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("calc-thread-");
executor.initialize();
return executor;
}


Подробнее здесь: https://stackoverflow.com/questions/540 ... -in-spring

Вернуться в «JAVA»