Приложение Java EE 7 работает на Wildfly 9.0.2.Final. Существует проблема с доступом к данным области запроса из методов @Asynchronous.
В веб-фильтре данные (например, токен) устанавливаются в bean-компонент RequestScoped CDI. Позже мы хотим получить доступ к этим данным. Все отлично работает, если мы работаем в одном потоке. Но если есть необходимость запускать код асинхронно, возникает проблема. CDI вводит пустой bean-компонент, и данные запроса теряются.
Вот пример:
@RequestScoped
public class CurrentUserService implements Serializable {
public String token;
}
@Stateless
public class Service {
@Inject
private RestClient client;
@Resource
private ManagedExecutorService executorService;
@Resource
private ContextService contextService;
@Asynchronous
private <T> Future<T> getFuture(Supplier<T> supplier) {
Callable<T> task = supplier::get;
Callable<T> callable = contextService.createContextualProxy(task, Callable.class);
return executorService.submit(callable);
}
public String getToken() throws Exception {
return getFuture(client::getToken).get();
}
}
@ApplicationScoped
public class RestClient {
@Inject
private CurrentUserService currentUserBean;
public String getToken() {
return currentUserBean.token;
}
}
В данном примере мы хотим получить доступ к токену текущего пользователя (CurrentUserService#token) из асинхронного метода Service.getToken. В результате получим null.
Ожидается, что данные "области запроса" должны быть доступны из задач, выполняемых в области запроса. Что-то вроде InheritableThreadLocal следует использовать, чтобы разрешить доступ к исходным данным потока из новых потоков.
Это ошибка? Может я что-то не так делаю? Если да, то как правильно распространять такие данные в асинхронные вызовы?
Заранее спасибо.
@Inject Instance<CurrentUserService> currentUserBean. - person jpkrohling   schedule 22.12.2015Service.getToken()принципиально синхронен. Он вызываетgetдля будущего, которое будет блокироваться до тех пор, пока будущее не будет выполнено. Так что весь этот асинхронный механизм, который у вас есть, все равно ничего не сделает. - person Steve C   schedule 23.12.2015