JSF session bean mit worker thread updaten

B

bananenkasper

Gast
Hallo zusammen,

ich baue gerade an einer Webseite (JSF - EJB - JPA).
Da die Suchen in der Datenbank teilweise recht lange dauern, möchte ich sie gerne asynchron absetzen.
D.h. durch einen anderen Thread ausführen lassen und den "JSF life cycle thread" direkt zurückkehren lassen.

Ananlog zu Swing: ich möchte das meine GUI nicht "einfriert", sondern das Ergebnis der Suche angezeigt wird, sobald es eben verfügbar ist.
In Swing würd ich es so machen:

GUI -> Anfrage -> EventDispachingThread -> WorkerThread -> rechnen -> SwingUtilitis.invokeLater() -> GUI

Vermutlich stehe ich grad böse auf dem Schlauch, aber wie würde ich das in einer JSF-Umgebung realisieren?
Das refreshen der HTML-seite müsste man evtl. über einen AJAX-gesteuerten, periodischen refresh lösen, aber das ist noch eine andere Geschichte.

Nochmal in kurz:

Wie kann ich mit einem extra-Thread auf den session-context zugreifen, und (threadsicher) ein update der Daten durchführen?

Schonmal Danke für jede Antwort!
 

MrWhite

Bekanntes Mitglied
Hallo,

ich wuerde die Suchen ueber einen Service an einen Threadpool uebergeben und dann diesen Service entweder per ajax pollen (richfaces hat z.b. a4j:poll oder a4j:push fuer einen fake push) oder eine ajax push api wie comet oder so nutzen.

Wo genau ist das Problem?
 
B

bananenkasper

Gast
Ich habe mal ein sehr einfaches Beispiel gebastelt, dass das Problem verdeutlichen sollte:

JSF:
Code:
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<f:view>
<h:outputText value="#{sessionBean(2).info}"></h:outputText>
<h:form>
<h:inputText value="#{sessionBean(2).query}"></h:inputText>
<h:commandButton value="Search" action="#{sessionBean(2).search}"></h:commandButton>
</h:form>
</f:view>
</body>
</html>

Java:
package de.test;
public class SessionBean {
	private static class Worker implements Runnable{
		private final SessionBean ref;
		Worker(SessionBean ref){
			this.ref = ref;
		}
		public void run() {
			ref.setInfo(ref.getQuery());	
			System.out.println("Success!");
		}
	}
	private volatile String info = "replace me...";
	private volatile String query = "enter query";
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getQuery() {
		return query;
	}
	public void setQuery(String query) {
		this.query = query;
	}
	public String search(){
		new Thread(new Worker(this)).start();
		return null;
	}
}

Klappt manchmal, manchmal nicht. Ist auch ganz klar gegen die JSF Konventionen.

Java:
package de.test;

import javax.faces.application.Application;
import javax.faces.context.FacesContext;

public class SessionBean2 {
	public static <V> V getManagedObject(String elString, Class<V> c, FacesContext context) {
		Application a = context.getApplication();
		V v = c.cast(a.evaluateExpressionGet(context, elString, c));
		return v;
	}
	private static class Worker implements Runnable{
		private final FacesContext context;
		Worker(FacesContext context){
			this.context = context;
		}
		public void run() {
			final SessionBean2 bean = getManagedObject("#{sessionBean2}", SessionBean2.class, context);
			if(bean == null)
				System.err.println("We do not have any FacesContext!");
			bean.setInfo(bean.getQuery());	
			System.out.println("Success!");
		}
	}
	private String info = "replace me...";
	private String query = "enter query";
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getQuery() {
		return query;
	}
	public void setQuery(String query) {
		this.query = query;
	}
	public String search(){
		new Thread(new Worker(FacesContext.getCurrentInstance())).start();
		return null;
	}
}
Scheitert an einer NullPointerException, da es für diesen neuen Thread kein FacesContext gibt.

Ich hoffe es ist einigermaßen klar geworden was das Problem ist.
 
Zuletzt bearbeitet von einem Moderator:

MrWhite

Bekanntes Mitglied
Ich verstehe dein Problem immer noch nicht (ohne den Code im Detail gelesen zu haben). Deine Threads müssen doch nur die Ergebnisse in irgendeine Liste reinschreiben. Irgendein anderer Service (z.B. deine Bean) kann doch dann immer prüfen, ob das Ergebnis der Anfrage schon vorhanden ist, sei es periodisch oder durch Interaktionen des Nutzers.

Wo ist das Problem?

1.) JSF setzt Abfrage ab
2.) Bean startet asynchrone Abfrage
3.) Abfrage schreibt Ergebnis irgendeine Datenstruktur (Liste/Hashtable oder sowas), bei Fertigstellung
4.) Bean prüft z.B. periodisch durch JSF abgefragt die Datenstruktur, ob das Ergebnis schon vorhanden ist

Das ist doch konzeptionell recht simpel, oder? Das ist auch schnell programmiert.
 
B

bananenkasper

Gast
Das Problem ist, dass ich dabei den Session-Kontext verliere.

Klar, ich kann raus aus dem life cycle thread, und irgendwo was speichern.
Das kann ich dann periodisch abfragen.
Aber ich komme sozusagen "nicht wieder zurück in meinen FacesContext".

Mehrere Benutzer würden dann alle auf das selbe Objekt zugreifen...
 
B

bananenkasper

Gast
ja, und die ID mappe ich dann zu jedem einzelnen Ergebnis?
und wenn eine Session ausläuft?

Wie halte ich die Map sauber?

Das ist doch nicht das ware.

"vanilla" JSF kann auch Objekte im Session-scope ablegen, bringt aber nix, da der neue Thread (wie bereits mehrfach erläutert) auf diesen Session-scope keinen zugriff hat.
 

MrWhite

Bekanntes Mitglied
Mein Gott, leg dein Thread-Objekt halt dann innerhalb deiner Session-Bean in einer Liste ab und frage dann über die Bean immer wieder ab, ob der Thread schon fertig ist.

Wenn er fertig ist, dann hole dein Suchergebnis vom Threadobjekt ab und präsentiere es dem Nutzer. Das sollte doch funktionieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Managed Bean Scope zwischen Request und Session gesucht Web Tier 6
P JSP: Liste in Bean über Session aufbauen Web Tier 6
H JSF - Bean (scope session) - Verfallsdatum? Web Tier 3
I Gleiche Session von EJB Container in JSF Container verwenden? Web Tier 21
R Session löschen Web Tier 3
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
J Session Servlet - JavaScript Web Tier 6
M Session closed - und nun? Web Tier 1
F JSF synchronized(session) Frage ? Web Tier 1
F JSF p:selectOneMenu Session Web Tier 10
T JSF Problem wenn Session abgelaufen ist Web Tier 6
Q JSF bei Session-Timeout Weiterleitung auf spezielle Login-Seite Web Tier 15
D JSF Überprüfen der Session ID in JSF und JAVA Web Tier 9
R Servlet Resource laden für SMTP - Session Web Tier 4
B JSF Mojarra 2.1.5: java.lang.IllegalStateException: Cannot create a session after the response has been Web Tier 7
R JSF Session Handling Web Tier 3
X JSP Auslesen der Daten einer Session Web Tier 3
crashfinger JSP Session verloren bei DNS Servernamen & IE Web Tier 6
C session trackung auf einfacher web-site Web Tier 17
F JSF Session-Kolision Web Tier 3
R Zugriff auf Session direkt auf JSF-Seite Web Tier 2
H JSF Session Initialisierung Web Tier 2
E JSP Browser Tab Session Web Tier 7
F Session Tutorial Web Tier 5
T JSP Session Login - Sicherheit Web Tier 4
J Loginbereich mit Session und Datenbank Web Tier 5
M 2 Cookies in der session (cocoon 2.2) Web Tier 4
F Richtiges Session Management mit Servlets Web Tier 4
7 Struts+AJAX- Session-Handling? Web Tier 2
J Crash bei session timeout Web Tier 3
M session Speicherort - ID ändern Web Tier 8
V ANFÄNGER : eigene Session Web Tier 3
V DatenbankConnection an Session hängen Web Tier 4
P session.removeAttribute Web Tier 3
K Orientierungslosigkeit: Webservice+Ajax(echo2)+Session-Management Web Tier 4
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
D JSF: Best Practice "Session invalidate nach Schließen des Browsers"? Web Tier 3
T Unbegrenzte Session Web Tier 14
D tapestry 5 session Web Tier 2
J Struts 2 session ID auslesen? Web Tier 5
M [J2EE] Session-Save Static-Objects? Web Tier 6
S Problem mit Session - Übergabe von Kontext zu Kontext Web Tier 2
F JSF: Beans in Session oder Request? Web Tier 4
T Problem bei Session-Timeout Web Tier 3
M JSF refresh vs. session scope Web Tier 9
G Session in Servlet Starten und mit JSTL auslesen Web Tier 2
G Servlet - Von Parametern umstellen auf Session Web Tier 8
G jsf session erstellen Web Tier 10
rambozola session attribut in servlets und jsps Web Tier 11
M JSF session.invalidate() klappt nicht Web Tier 3
G Session.invalide() funktioniert nicht richtig Web Tier 2
6 JSF Form Attribute nicht an Bean übergeben Web Tier 2
G HTML Fragment in Bean erzeugen? Web Tier 1
W JSF Probleme mit Zugriff zur Managed Bean Web Tier 11
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
F JSF Bean funktioniert nicht immer.. Web Tier 3
I CSS von Client -> an Bean senden Web Tier 0
H JSF jsf/sessionScoped Bean - Bilder (jpg) werden nicht richtig dargestellt Web Tier 1
S Java Bean und Java Servlet Web Tier 2
G jsf bean erstellen die mir die aktuelle uhrzeit ausgibt als xhtml Web Tier 5
M viele Objekte des Managed Bean Web Tier 3
S [JSF] Zugriff auf Bean (Eclispe,JBoss) Web Tier 12
P JSF Prob mit xhtml / Bean / JS Web Tier 6
J JSF Initialisierung einer ApplicationScoped Bean Web Tier 2
B Berechnen und Anzeigen von Formeln aus der Chemie und Physik mit JSP und Bean Web Tier 14
H Bean-Objekte aus XML erstellen Web Tier 2
L expression language Bean && Bean Web Tier 3
C JSF Methoden in Backing-Bean als JSF-Property Web Tier 3
P JSF Merkwürdiges Verhalten einer Bean Web Tier 11
S CDI: Bean aus einem anderen jar Web Tier 3
D JSF EL #{not null bean.property} Parse exception Web Tier 2
T Seam-Komponenten oder Java Bean soll direkt nach Appserver-Start "leben" Web Tier 4
B JSF Servlectexception: Verwalteter Bean "..bean" kann nicht erstellt werden Web Tier 2
G JSF Bean Vererbung Web Tier 5
J Validieren abhängiger Felder mit JEE6/Bean validation Web Tier 33
F Leere Bean? Web Tier 7
S JSF2: Managed bean aus anderer Dependency Web Tier 7
W MVC mit Bean, JSP und Servlet Web Tier 6
S Style bei fehlerhafter Eingabe (Bean Validation) ändern Web Tier 2
H Managed Bean Aufruf auf Stack legen Web Tier 10
S Bean Validation (JSF 2.0) funktioniert nicht. Web Tier 4
V Vector aus Bean "holen" / JSP Web Tier 3
K bean methode von jslt aufrufen Web Tier 7
I Eine Bean von einer anderen Bean aufrufen Web Tier 2
J Managed bean und javascript kommunikation (JSF 2) Web Tier 2
G JSF javax.faces.bean Web Tier 2
K Anfängerfrage in JSF: <h:inputText> aus Managed Bean ansprechen Web Tier 6
S Managed bean nicht initialisiert Web Tier 2
A JSF+Glassfish: Probleme mit Managed Bean Web Tier 2
E Methode einer Bean aus anderer Bean aufrufen Web Tier 10
S [SelectItems value(herkunft bean)] in [UI:repeat] lädt daten nicht neu nach Web Tier 3
N MessageResources von Struts in Form-Bean Web Tier 4
N java bean in eclipse Web Tier 6
A JSF SelectOneMenu mit Werten aus Bean vorbelegen Web Tier 2
S JSF: Frage wegen managed-bean Web Tier 3
pusteblume Mehrere Objekte einer Bean Web Tier 10
M Problem mit JSP und Bean Web Tier 2
O 2 Fragen zu JSP und Bean Web Tier 4
E value übergabe an bean! aber wie? Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben