Instanzen einer Klasse zaehlen

milchbubbi

Mitglied
hallo zusammen,

ich schreibe meine Webseite gerade in JSP, und moechte die Anzahl der Besucher haben, die gerade auf der Seite sind. Bei jedem neuen Besucher wird wie folgt eine Instanz der Klasse Guest angelegt:

Code:
<jsp:useBean id="guest" scope="session" class="package.Guest">

es liegt also nahe, die Instanzen der Klasse zaehlen, da diese eh nur solange existieren, wie der Besucher auf der Seite agiert.

In c++ haette ich einfach ein statisches Attribut in die Klasse Guest gesetzt, was im Konstruktor erhoeht, und im Destruktor verringert wird.
Wie kann ich das in Java realisieren?

Thx im Voraus fuer die Antworten,
gruss
 
Wenn der GC eine Instanz aus dem Speicher räumen will, ruft er vorher deren finalize()-Methode auf. Im Prinzip kann man dort also Dinge erledigen, die man in C++ in einem Destruktor macht. Allerdings ist hier natürlich das Problem, daß man nie genau weiß wann der GC das Objekt wegräumt. Bei ausreichendem Speicher für die VM möglicherweise überhaupt nicht, bevor das ganze Programm beendet wird.

Eine andere Möglichkeit, die alelrdings erst ab Java 5.0 zur Verfügung steht, sind Semaphoren. Das sind Referenzzähler und damit genau das, was Du brauchst.
 
ishino hat gesagt.:
[...]Allerdings ist hier natürlich das Problem, daß man nie genau weiß wann der GC das Objekt wegräumt. Bei ausreichendem Speicher für die VM möglicherweise überhaupt nicht, bevor das ganze Programm beendet wird.[...]

das war ist ja gerade mein Problem ;)

ishino hat gesagt.:
[...]Eine andere Möglichkeit, die alelrdings erst ab Java 5.0 zur Verfügung steht, sind Semaphoren. Das sind Referenzzähler und damit genau das, was Du brauchst.[...]

hoert sich genau richtig an, thx.
 
so ganz tut es mein Problem noch nicht loesen, denn ich weiss immer noch nicht, woran ich sehe, dass ein Besucher die Seite verlassen hat (wenn man das bei http so sagen kann). Die einzige Moeglichkeit, die mir einfaellt, ist die session.invalidate() aufzurufen... aber das muss ja vom Besucher kommen. Wenn er das Fenster aber schliesst, passiert aber kein Aufruf.

Was mich vielleicht weiter bring, ist die Lebensdauer einer Session auf beispielweise fuenf Minuten zu begrenzen, ich muesste nur noch gucken, wie ich es bei tomcat mache.
 
Hallo!

In c++ haette ich einfach ein statisches Attribut in die Klasse Guest gesetzt, was im Konstruktor erhoeht, und im Destruktor verringert wird.
Wie kann ich das in Java realisieren?
Unter Java wäre es auch möglich eine statische Klassenvariable innerhalb des Konstruktoraufrufs zu inkrementieren.
Da Java jedoch keine Destruktoren bietet kann man den Counter auf diese Weise leider nicht mehr dekrementieren.
Von der Lösung mit finalize() ist abzuraten, da nicht garantiert ist dass die finalize() Methode überhaupt aufgerufen wird
bzw. wann.

Weiterhin ist das in meinen Augen eine nicht sehr verlässliche Methode zur Ermittlung der aktuellen Benutzer.
Ein IMHO besserer Ansatz basiert auf HttpSessions:
http://www.tutorials.de/forum/j2ee/...ossen-wird.html?highlight=HttpSessionListener


Eine andere Möglichkeit, die alelrdings erst ab Java 5.0 zur Verfügung steht, sind Semaphoren. Das sind Referenzzähler und damit genau das, was Du brauchst.
Semaphoren sind keine Referenzzähler ... sie dienen vielmehr als eine bestimmte Art von Sperre in der Nebenläufigen Progammierung die über einen Zähler den Zugriff auf einen gesperrten Bereich steuern.

Gruß Tom
 
Zurück