Асинхронный метод с веб-обработкой SELENIUM не работает параллельно - PullRequest
0 голосов
/ 03 апреля 2020

У меня Service.class с start() методом:

public ResponseEntity<Object> start() {

        List<Company> companiesList = dbHandler.retrieveCompaniesList();
        Company company = null;
        for (int i = 0; i < companiesList.size(); i++) {
            asychronous.webScrapAndSaveInDb(companiesList, i, company);
        }
  return null;
}

У меня Asynchronous.class с асинхронным методом webScrapAndSaveInDb().

@Async("threadPoolTaskExecutor")
public CompletableFuture<Void> webScrapAndSaveInDb(List<Company> companiesList, int i, Company company, String bankierEndpoint) {
        log.info("Asychronous method has started " + i +" time");
        company = companiesList.get(i);
        company = newsUtils.newsWebScrap(company, endpoint);
        return null;
    }

Работает параллельно только с методом log.info() внутри. Поэтому настройка должна быть выполнена правильно. Почему метод webscraping (newsWebScrap()) не работает параллельно? Как заставить это работать?

Это мой NewsUtils.class с newsWebScrap() методом, который списывает список строк с сайта:

public Company newsWebScrap(Company company, String endpoint) {

    System.setProperty("webdriver.gecko.driver", geckoDriverPath);

    List<ReadedNewsObject> readedBessaOrHossaObjectsList = new LinkedList<ReadedNewsObject>();

    Double actualPriceDouble = tradingUtils.getActualPrice(company); 

    WebDriver driver = new FirefoxDriver();
    driver.get(endpoint + company.getCompanyNames().get(0));
    WebElement boxContent = driver.findElement(By.cssSelector("div.boxContent.boxList"));
    WebElement ulElement = boxContent.findElement(By.tagName("ul"));
    List<WebElement> listNewsElements = ulElement.findElements(By.tagName("li"));
    for (int j = 0; j < listNewsElements.size(); j++) {
        WebElement aElement = listNewsElements.get(j).findElement(By.tagName("a"));
        String newsStringWithData = aElement.getText();
        String newsString = newsStringWithData.substring(11);
        ReadedNewsObject readedNewsObject = new ReadedNewsObject();
        readedNewsObject.setNewsString(newsString);

        readedBessaOrHossaObjectsList.add(readedNewsObject);
    }       
    company.setReadedNewsObjectsList(readedBessaOrHossaObjectsList); 

    driver.close();

    return company;
}
...