Из потока с запросом, CompletableFuture
s должен быть заполнен задачей, выполняемой в исполнителе. Предоставляемый Поставщик использует услугу MessageService
, относящуюся к домену, которая относится к сеансу. Эта услуга вводится Гисом.Выделение Guice OutOfScopeException при выполнении CompletableFuture
public class MessageProcessingPage {
private MessageService messageService;
@Inject
public MessagProcessingPage (MessageService messageService) {
this.messageService = messageService;
}
// Called by request scoped thread.
public void onProcessMessagesButton() {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CompletableFuture.supplyAsync(
// Called from a thread from the threadpool.
() -> {return messageService.retrieveMessageMetadataSet(x, y);}
, executorService);
...
}
...
}
MessageService
имеет (сеанс Scoped) MessageRestClient
, которая впрыскивается.
@SessionScoped
public class MessageService {
private MessageRestClient messageRestClient;
@Inject
public MessageRestClient (MessageRestClient messageRestClient) {
this.messageRestClient = messageRestClient;
}
public MessageMetaDataSet retrieveMessageMetadataSet(x, y) {
List<MessageMetaData> listOfMetaData = messageRestClient.retrieve(x, y, z);
...
}
...
}
@SessionScoped
public class MessageRestClient {
...
}
Guice получает в беду, когда он пытается привнести MessageRestClient
.
java.util.concurrent.CompletionException: com.google.inject.ProvisionException: Unable to provision, see the following errors:
1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped [MessageRestClient]. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
Я читал о методе в ServletScopes
: public static <T> Callable<T> transferRequest(Callable<T> callable)
Но я не вижу способ использовать это, так как нет не вызываемых объектов приходят в игру. Можете ли вы помочь мне с решением?
На самом деле стоит ли новый поток, но из-за нехватки времени: я заметил, что в таком сценарии следует избегать использования вспомогательной инъекции. В «MessageService» я ввел «MessageFactory» (используя вспомогательную инъекцию), который используется методом, вызываемым из задачи. Гуис тоже попал в неприятности. Поскольку я сменил вспомогательную инжектированную фабрику на обычную фабрику, все работает нормально. –