Използвайки jhipster при пролетно зареждане 1.5.4, трудно ми е да накарам фоновите задачи да се изпълняват асинхронно; те изглежда се изпълняват синхронно, използвайки различен taskExecutor и набор от нишки от този, който съм конфигурирал.
Всичко това се случва в услуга, която за яснота е дефинирана така:
@Service
@Transactional
public class AppService {
@Scheduled(fixedDelay = 3000)
public void consumeData() {
// connect to a subscriber and push data to the workerBee
for(Tuple data : this.getTuples()) {
workerBee(data);
}
}
@Timed
@Async
public void workerBee(Tuple data) throws Exception {
// ... do something that takes 300ms ....
Thread.sleep(300);
}
}
Може да се каже, че услугата не е идеалното място за тази работа, но за демонстрационни цели е подходящо.
(също като настрана, изглежда, че @Timed не работи, но прочетох някъде, че @Timed не работи, когато се извика вътрешно в рамките на услугата)
Съответен раздел от application.yml
:
jhipster:
async:
core-pool-size: 8
max-pool-size: 64
queue-capacity: 10000
Използвайки по подразбиране, генериран AsyncConfiguration.java, който изглежда така:
@Override
@Bean(name = "taskExecutor")
public Executor getAsyncExecutor() {
log.debug("Creating Async Task Executor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(jHipsterProperties.getAsync().getCorePoolSize());
executor.setMaxPoolSize(jHipsterProperties.getAsync().getMaxPoolSize());
executor.setQueueCapacity(jHipsterProperties.getAsync().getQueueCapacity());
executor.setThreadNamePrefix("app-Executor-");
return new ExceptionHandlingAsyncTaskExecutor(executor);
}
Проверих, че компонентът taskExecutor се създава и се използва от liquibase.
Когато свържа visualvm, виждам цялата работа, която се случва в pool-2-thread-1
, което трябва да е някакъв вид по подразбиране и е очевидно, че работата се извършва синхронно, а не асинхронно.
Неща, които съм пробвал:
- Посочване на изпълнителя в анотацията @Async като
@Async("taskExecutor")
- Проверка на конфигурацията на taskExecutor с 8 нишки в основния размер на пула.
- Проверка дали приложението има анотацията @EnableAsync (тя има по подразбиране).