Skip to Main Content

Java EE (Java Enterprise Edition) General Discussion

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Monitor the number of active sessions (for web app deployed on JBoss 4.0.5)

843842Aug 13 2008 — edited Jan 17 2009
Hi Gurus,

This is a re-post because apparently I posted it in the wrong forum the first time around.

Please forgive the somewhat lengthy posting, but I want to make sure I don't leave out any pertinent information.

I have a J2EE web application deployed on JBoss (let's say it's called MyApp), and as part of my monitoring I want to know how many active sessions there are at any one time (ie: how many users are currently logged in and have a session that hasn't timed out).

Initially I had hoped that I could use some monitoring software (eg: Hyperic, AdventNet App Manager, etc) to simply monitor JBoss, but so far none of the software I have evaluated will actually monitor active sessions for a web app.

On the bright side, one of the monitoring applications I have been looking at (AdventNet App Manager) allows me to create a custom monitor which will:

a) execute a script (eg: generate_session_count.bat)
b) read the output in a log file

So I thought maybe I can create a custom class which I can deploy as part of the web app, and it will get the session count and write the number to a log file.

I did some searching and found the following code ([click here|http://www.java.happycodings.com/Java_Servlets/code10.html]) which is supposed to count active sessions:

--- JSP page for testing (session_count.jsp) ---
<%
Integer icount = (Integer)session.getAttribute("count");
out.println("sessions="+icount);
%>
--- Servlet that handles session count (CounterListener.java) ---
import javax.servlet.*;
import javax.servlet.http.*;
 
public final class CounterListener implements HttpSessionListener
    {
     private int count = 1;
     private ServletContext context = null;
    
     public synchronized void sessionCreated(HttpSessionEvent se)
         {
         count++;
         log("sessionCreated("+se.getSession().getId()+") count="+count);
         se.getSession().setAttribute("count",new Integer(count));
     }
    
     public synchronized void sessionDestroyed(HttpSessionEvent se)
         {
         count--;
         log("sessionDestroyed("+se.getSession().getId()+") count="+count);
         se.getSession().setAttribute("count",new Integer(count));
     }
    
     public int getCount()
         {
         return this.count;
     }
    
     public void addCount()
         {
         count++;
     }
    
     private void log(String message)
         {
         if (context != null)
         context.log("SessionListener: " + message);
         else
         System.out.println("SessionListener: " + message);
     }
    
}//close class CounterListener
--- web.xml file modification ---
<?xml version="1.0" encoding="ISO-8859-1"?>
 
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
 
<web-app>
<display-name>My Application</display-name>
 
<!-- add this line of code -->
<listener>
<listener-class>CounterListener</listener-class>
</listener>
 
<description>
Welcome to MyApp
</description>
 
</web-app>
It took me a while and some more searching to figure out how to use/deploy the above code, and I was finally able to start JBoss, and when I requested the folowing URL:

http://localhost/MyApp/session_count.jsp

the response was:

sessions=n

where n is some number.

Initially I was very excited, but after doing some testing I found that the number of sessions being returned was not correct. I found that even if no-one was logged in to the app, the session count was 2, and when I launched a few separate browsers and logged in, the session count was wrong (consistently seemed to be double the actual number of users logged in - is that some quirky characteristic of HttpSessionListener which reports two sessions for each user/browser?).

Finally we get to the question part of my post. :)

1. Why is the session count wrong? Can someone suggest some alternative code which will report the correct number of sessions?
2. How do I get the class to output the session count to a file which can be read by the monitoring software?
3. Is there a better way? (This is a very open-ended question and I am open to any suggestions)

Cheers,

Paul
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 14 2009
Added on Aug 13 2008
7 comments
1,018 views