最初,我是使用“实现”方法使用常规的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();
}
}
}
答案 0 :(得分:1)
默认情况下,Spring使用SimpleAsyncTaskExecutor
执行异步方法。默认情况下,这将为每个操作生成一个新线程。
要定义自己的执行程序以用于异步任务,请创建一个实现TaskExecutor
接口的bean或一个名为Executor
的{{1}} bean。
如果您只想为此组件使用自己的自定义执行程序,则可以"taskExecutor"
并提供自己的执行程序服务:
implement AsyncConfigurer