Abbruch einer ViewScoped Bean in Arbeit

  • Themenstarter Themenstarter Gelöschtes Mitglied 68249
  • Beginndatum Beginndatum
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
 
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.
Zum Beispiel mit einer Session-Bean, der Du den SessionContext injectest und eine @Asynchronous-Methode spendierst. Das zurückgegebene Future-Objekt kannst Du im Client canceln und in der Methode kannst Du über den SessionContext abfragen, ob der Task abgebrochen wurde. Im Client könntest Du in einer SessionScoped-Bean das Future halten und auf diese Weise auch auf einen Aufruf je Session und Zeitpunkt begrenzen.
 

Zurück
Oben