Использование завершаемого будущего для выполнения асинхронной задачи в сервлете вызывает java.lang.RuntimeException - PullRequest
0 голосов
/ 21 января 2019

Я столкнулся с проблемой в своем развертывании, где я использую завершаемое будущее для выполнения асинхронной задачи в сервлете tomcat (версия 8.5.23).Я знаю, что мой следующий вопрос не мог сказать много о деталях реализации, но, к сожалению, я не смог придумать простой пример, чтобы воссоздать проблему.Пожалуйста, простите меня за это.Я надеюсь, что некоторые эксперты в этой области могут дать мне совет или совет высокого уровня, который я мог бы изучить в дальнейшем.

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

Что я хотел бы сделать, так это «всякий раз, когда я получаю запрос от клиента, я должен запустить задачу, которая может занять час.Поэтому я немедленно отвечаю пользователю, что «задание началось» до его завершения.

Я изначально использовал AsyncContext.start() для этого, но обнаружил, что AsyncContext не будет возвращать ответ клиенту, пока он не вызовет onComplete(AsyncEvent event).

Поэтому я заменил AsyncContext.start()с CompletableFuture.runAsync(Runnable).Изначально мне показалось, что он работает правильно, но позже я обнаружил, что это вызывает у меня проблему.

В своей задаче я использовал com.caucho.hessian.client.HessianProxyFactory.create(Class api, String urlName) для создания прокси-класса внутреннего интерфейса, но после использования завершаемогов будущем наступает время выполнения, которое говорит: java.lang.RuntimeException: java.lang.IllegalArgumentException: interface MyInterface is not visible from class loader.

Буду благодарен, если кто-нибудь сможет пролить свет на проблему

1 Ответ

0 голосов
/ 21 января 2019

Я нашел решение для моей проблемы. Кажется, это работает сейчас, но я не знаю, создаст ли это новую проблему. Я в основном гарантировал, что асинхронная задача использовала тот же загрузчик классов.

ClassLoader cl = Thread.currentThread().getContextClassLoader();
CompletableFuture.runAsync(() -> {
try {
       Thread.currentThread().setContextClassLoader(cl);
       .......
...