- есть своего рода ежедневный расчет, который можно выполнить задним числом по месяцам.
- это отнимает очень много времени, требует большого количества вычислений.
- ни один день не зависит от результата другого дня, каждый день автономен.
- вычисления будут запускаться из веб-API.
- все результаты будут сохранены для дальнейшего использования.
- все методы недействительны. >
куда мне поместить аннотацию @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