ThreadPoolExecutor и Spring Async - PullRequest
       1

ThreadPoolExecutor и Spring Async

0 голосов
/ 04 июня 2019

Изначально я использовал обычную многопоточность Java, используя метод «Implements». Однако @Autowired не работает, когда класс создается с new в Spring, поэтому я пытаюсь изменить его на использование метода Spring * Async. Это то, что я до сих пор. Как мне добавить потоки в ThreadPoolExecutor?

Класс, который должен создавать потоки

@Component
public class ScheduledCountyScraper {

    @Autowired
    StateScrapeQueueRepository stateScrapeQueueRepository;

    @Autowired
    CountyScrapeRepository countyScrapeRepository;

    // @Scheduled(cron = "0 0 */3 * * *")
    @EventListener(ApplicationReadyEvent.class)
    public void scrapeCountyLinks() {
        System.out.println("Scrape county links ran!");
        try {
            List<String> stateLinks = stateScrapeQueueRepository.getStatesLinks(website);
            ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);

            //what to do here?

            executor.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("---------------------");
        }
    }

}

Асинхронный класс

@Component
@EnableAsync
public class CountyScraper {
    volatile private String stateLink;

    @Autowired
    StateScrapeQueueRepository stateScrapeQueueRepository;

    @Autowired
    CountyScrapeRepository countyScrapeRepository;

    public CountyScraper() {
    }

    public CountyScraper(String stateLink) {
        this.stateLink = stateLink;
    }

    @Async("countyScraper")
    public void run() {
        try {
            // other code

            stateScrapeQueueRepository.updateScrapeTimestamp(stateLink);
            countyScrapeRepository.insertCountyLinks(countyLinks, website);

        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

1 Ответ

1 голос
/ 04 июня 2019

По умолчанию Spring использует SimpleAsyncTaskExecutor для выполнения асинхронных методов. По умолчанию будет создаваться новый поток для каждой операции.

Чтобы определить собственного исполнителя для использования с асинхронными задачами, создайте компонент, реализующий интерфейс TaskExecutor, или компонент Executor с именем "taskExecutor".

Если вы хотите, чтобы у вас был собственный пользовательский исполнитель только для этого компонента, вы можете implement AsyncConfigurer и предоставить собственную службу исполнителя:

@Override
public Executor getAsyncExecutor() {
    return MY_EXECUTOR;
}

@Override
public  AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return MY_EXCEPTION_HANDLER;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...