Я новичок в игре! и во время работы в рамках проекта у меня возникла следующая ситуация:
У меня есть контроллер HomeController
, который выполняет два основных действия:
public CompletationStage<Result> search(String query){
return docSearcher.search(query).thenApplyAsync((json) -> {
return ok(json);
}, ec);
}
public CompletationStage<Result> zoom(){
return docSearcher.zoom().thenApplyAsync((json) -> {
return ok(json);
}, ec);
}
Действие search
получает параметр query
и делегирует docSearcher
для поиска в БД (docSearcher
вводится в контроллер).
Действие zoom
должно обеспечить увеличение / уменьшение масштаба в визуализации, отображаемой как HTML.
Проблема в том, что конструктор docSearcher
создает экземпляр QuadTree
, который будет использоваться для эффективного масштабирования, поэтому этот экземпляр QuadTree
должен быть доступен для действия zoom
после вызова действия search
. Таким образом, один QuadTree
в docSearcher
распределяется между клиентами / потоками. Я хотел бы получить запрос на действие QuadTree
на search
и поделиться этим новым созданным QuadTree
с последующими действиями zoom
.
Как мне добиться этого с помощью Play !? Я не уверен, как я могу хранить пользовательские данные (QuadTree
зависит от запроса пользователя, и я не хочу создавать новое дерево для каждого запроса, я хочу разделить QuadTree
s среди запросов поиска / масштабирования).
Спасибо.
Следуйте коду docSearcher
класс:
public class LocalDocumentSearcher implements DocumentSearcher {
private QuadTree quadTree;
@Inject
public LocalDocumentSearcher(Database db, DatabaseExecutionContext context) {
this.executionContext = context;
this.quadTree = initQuadTree();
}
@Override
public CompletionStage<String> search(String query) throws Exception {
return CompletableFuture.supplyAsync(() -> {
return searchData(queryData);
}, executionContext);
}
@Override
public CompletionStage<String> zoom() throws Exception {
return CompletableFuture.supplyAsync(() -> {
return zoomData();
}, executionContext);
}