Классы не загружаются должным образом в CompletableFuture - PullRequest
0 голосов
/ 22 октября 2018

Ниже приведен код, который я написал с использованием CompletableFuture -

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
    printResult();
    return "complete future!";
});

В приведенном выше коде в функции printResult я использую некоторые классы, связанные с xerces, для выполнения некоторой аутентификации, и это дает мне SAX2ошибка класса драйвера не найдена!

Однако, когда я написал тот же код с использованием Callable, он работает нормально -

Callable<String> callableFuture = () -> { 
    printResult(); 
    return "callable!";  
};

Кроме того, printResult () работает совершенно нормально вне CompletableFutureтакже.Просто хотел узнать, есть ли здесь кто-нибудь, кто понимает, что здесь происходит.Благодарим вас за помощь!

Редактировать: Я немного покопался в журналах, и это фактическое сообщение об ошибке - {ForkJoinPool.commonPool-worker-2} |[---] |Ошибка: класс драйвера SAX2 org.apache.xerces.parsers.SAXParser не найден

1 Ответ

0 голосов
/ 22 октября 2018

Callable - это просто интерфейс (и @FunctionalInterface), и он не предполагает ничего о контексте, в котором он будет вызываться.

CompletableFuture::supplyAsync(Supplier<U> supplier) отличается от своих документов:

Возвращает новое CompletableFuture, которое асинхронно завершается задачей, выполняющейся в ForkJoinPool.commonPool(), со значением, полученным путем вызова данного поставщика.

Так что возможно, что вВ вашем случае полученная ошибка («Ошибка драйвера SAX2 не найдена!») вызвана тем, что при выполнении printResult() из CompletableFuture драйвер SAX2 еще не загружен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...