G
Gelöschtes Mitglied 68249
Gast
Hi,
ich habe folgendes Problem:
Ich habe eine Bean in einem JAVA EE Umfeld hinter einem Primefaces 10 Frontend, diese ist ViewScoped. Der User sucht über diese Bean nach Dingen und diese sSuche kann unter Umständen lange genug dauern, dass der User auf die Idee kommen könnte wild auf Knöpfe im Menü zu klicken.
Das Problem ist aber, dass die Suche scheinbar im Hintergrund weiter Dinge tut und wenn der User zurück geht auf die Suchseite, und noch einmal Sucht, dann erhält er ein wirres Ergebnis.
Jetzt wäre für mich das Einfachste wenn er User eine Möglichkeit hätte die Suche ab zu brechen, aber ich weiß nicht, wie das gehen soll. Hier der Code in der Bean:
[CODE lang="java" title="SearchBean"]public void search() {
searchResult = new SearchResult();
List<ReferenceSystem> reflist = Arrays.asList(selectedRefSystems);
List<String> searchvalues = makeValueList(searchValueBox);
Map<String, String> outputConfig = ServerCache.getCache().getSysConf().getDefaultOutputOrder();
String intSearchField = outputConfig.get(searchfield);
searchResult.setSearchResults(SearchInterface.performSearch(intSearchField, searchvalues, reflist));
searchResult.setSearchValue(searchfield);
searchResult.setSearched(true);
sortBy = SortMeta.builder()
.field(searchfield)
.order(SortOrder.ASCENDING)
.build();
activeTab = 1;
PrimeFaces.current().ajax().update("searchform:searchtab");
}[/CODE]
Der Punkt SearchInterface.performSearch(intSearchField, searchvalues, reflist) dauert dabei am längsten und dieser müsste irgendwie abgebrochen werden können.
Hab ich da eine Möglichkeit, oder muss ich das irgendwie anders kapseln, damit es abbrechbar ist?
Ich hatte früher schon einmal probiert die Suche auf zu hübschen, bin aber kläglich gescheitert. Die Suche arbeitet im Endeffekt sequentiell jedes Fremdsystem nacheinander ab und added das Ergebnis der Ergebnisliste. Schöner wäre, wenn in allen Systemen parallel gesucht werden könnte und man dann alle Ergebnisse einer Variablen zusammengefasst werden. Hier mal der Code der performSearch:
[CODE lang="java" title="performSearch"]public static List<SearchResultElement> performSearch(String searchField, List<String> searchValues, List<ReferenceSystem> refList) {
searchResult = new ArrayList<>();
Map<ReferenceSystem, ConnectorStatus> availableStates = ConnectorStatusDbInterface.getConnectorsByListMap(refList);
for(ReferenceSystem ref : refList) {
ConnectorStatus state = availableStates.get(ref);
if(!state.isAvailable()) continue;
try {
performSingleSearch(ref, searchField, searchValues);
} catch(Exception e) {
LOG.error("Fehler bei der Suche [" + ref.displayName() + "]:", e);
}
}
return searchResult;
}[/CODE]
Wäre schön, wenn mir wenigstens jemand zu dem Abbruch helfen könnte.
Gruß Daniel
ich habe folgendes Problem:
Ich habe eine Bean in einem JAVA EE Umfeld hinter einem Primefaces 10 Frontend, diese ist ViewScoped. Der User sucht über diese Bean nach Dingen und diese sSuche kann unter Umständen lange genug dauern, dass der User auf die Idee kommen könnte wild auf Knöpfe im Menü zu klicken.
Das Problem ist aber, dass die Suche scheinbar im Hintergrund weiter Dinge tut und wenn der User zurück geht auf die Suchseite, und noch einmal Sucht, dann erhält er ein wirres Ergebnis.
Jetzt wäre für mich das Einfachste wenn er User eine Möglichkeit hätte die Suche ab zu brechen, aber ich weiß nicht, wie das gehen soll. Hier der Code in der Bean:
[CODE lang="java" title="SearchBean"]public void search() {
searchResult = new SearchResult();
List<ReferenceSystem> reflist = Arrays.asList(selectedRefSystems);
List<String> searchvalues = makeValueList(searchValueBox);
Map<String, String> outputConfig = ServerCache.getCache().getSysConf().getDefaultOutputOrder();
String intSearchField = outputConfig.get(searchfield);
searchResult.setSearchResults(SearchInterface.performSearch(intSearchField, searchvalues, reflist));
searchResult.setSearchValue(searchfield);
searchResult.setSearched(true);
sortBy = SortMeta.builder()
.field(searchfield)
.order(SortOrder.ASCENDING)
.build();
activeTab = 1;
PrimeFaces.current().ajax().update("searchform:searchtab");
}[/CODE]
Der Punkt SearchInterface.performSearch(intSearchField, searchvalues, reflist) dauert dabei am längsten und dieser müsste irgendwie abgebrochen werden können.
Hab ich da eine Möglichkeit, oder muss ich das irgendwie anders kapseln, damit es abbrechbar ist?
Ich hatte früher schon einmal probiert die Suche auf zu hübschen, bin aber kläglich gescheitert. Die Suche arbeitet im Endeffekt sequentiell jedes Fremdsystem nacheinander ab und added das Ergebnis der Ergebnisliste. Schöner wäre, wenn in allen Systemen parallel gesucht werden könnte und man dann alle Ergebnisse einer Variablen zusammengefasst werden. Hier mal der Code der performSearch:
[CODE lang="java" title="performSearch"]public static List<SearchResultElement> performSearch(String searchField, List<String> searchValues, List<ReferenceSystem> refList) {
searchResult = new ArrayList<>();
Map<ReferenceSystem, ConnectorStatus> availableStates = ConnectorStatusDbInterface.getConnectorsByListMap(refList);
for(ReferenceSystem ref : refList) {
ConnectorStatus state = availableStates.get(ref);
if(!state.isAvailable()) continue;
try {
performSingleSearch(ref, searchField, searchValues);
} catch(Exception e) {
LOG.error("Fehler bei der Suche [" + ref.displayName() + "]:", e);
}
}
return searchResult;
}[/CODE]
Wäre schön, wenn mir wenigstens jemand zu dem Abbruch helfen könnte.
Gruß Daniel