ThreadPoolExecutor和Spring异步

时间:2019-06-03 22:04:27

标签: spring spring-boot

最初,我是使用“实现”方法使用常规的Java多线程处理的。但是,在Spring中使用new创建类时,@ Autowired不起作用,因此我试图将其更改为使用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 个答案:

答案 0 :(得分:1)

默认情况下,Spring使用SimpleAsyncTaskExecutor执行异步方法。默认情况下,这将为每个操作生成一个新线程。

要定义自己的执行程序以用于异步任务,请创建一个实现TaskExecutor接口的bean或一个名为Executor的{​​{1}} bean。

如果您只想为此组件使用自己的自定义执行程序,则可以"taskExecutor"并提供自己的执行程序服务:

implement AsyncConfigurer