JSF Wie zählt man die User die online sind?

M

mannohnenamen

Mitglied
Hallo Leute,

ich schreibe ein Onlineportal mit JSF 2.0 und möchte gerne die User zählen, die sich gerade online auf der Plattform aufhalten.
Mein Vorschlag wäre die Bean-Objekte zu zählen die einen @ApplicationScope haben.
Ich würde mir per FacesContext eine Liste dieser Objekte geben lassen und die Größe der Liste entspricht den Onlineusern.

Denke ich zu kompliziert, sprich gibt es einen einfacheren Weg oder ist dieser Ansatz ok?
 
S

Sym

Gast
Du kannst eine SessionBean erzeugen, die beim Login erzeugt wird und diese zählen. Eine ApplicationScopeBean ist sessionübergreifend.

Oder Du schreibst den Loginstatus in die DB.

Ansonsten ist der Ansatz ok.
 
M

mannohnenamen

Mitglied
Ich habe folgende Lösung, allerdings noch nicht ausführlich getestet.
Weiss also nicht ob es für mehr als ein User funktioniert.

Java:
public int getJuserOnline() {
    juserOnline = 0;

    Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    for( Map.Entry<String, Object> entry : map.entrySet() )
    {
      String key = entry.getKey();
      if(key.equals("juserHandler"))
          juserOnline++;
    }
    return juserOnline;
}

Edit: Nein, so klappst es leider nicht. Die Methode getSessionMap() gibt immer nur ein JuserHandler an und zwar den der als erstes erstellt wurde. Die folgenden werden nicht berücksichtigt.
 
Zuletzt bearbeitet:
M

mannohnenamen

Mitglied
Eine andere Idee war es ein Managed Bean mit @ApplicationScoped und @Singleton zu benutzen, der einen Counter hochhält bzw. runterzählt.
In der entsprechenden Klasse UserHandler mit @SessionScoped habe ich die Methoden
Java:
@PostConstruct
private void init() {

        Logger.getLogger(UserHandler.class.getName()).log(Level.INFO, 
                "### Bean: Das Bean \"" + this.getClass() + "\" wurde gestartet.");
        
        treeService.decreaseJuserCount();
}

@PreDestroy
public void destroy() {
        Logger.getLogger(UserHandler.class.getName()).log(Level.INFO, 
                "### Bean: Das Bean \"" + this.getClass() + "\" wurde zerstört.");
        
        treeService.decreaseJuserCount();
}
hinzugefügt.

Das Problem besteht allerdings dabei, dass die @PreDestroy-Methode nicht aufgerufen wird.
Selbst dann nicht wenn der Browser geschlossen wird. Ich habe erwartet, dass diese Methode aufgerufen wird, wenn die Session abgelaufen ist.

Gibt es einen anderen Ansatz, um diese Methode aufzurufen?
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben