My requirement is to track user activity on my application centrally. The purpose is to capture click times of user actions to monitor performance and for reporting purposes to end users. To break my question into two parts.
1) Capturing user interactions: How do I intercept all server side events and capture the start and end times of all requests ? For e.g. Is there a way to figure out the button that was clicked by the user at what time and how much time was spent in the request. Is there anyway to capture all sever events like valueChangeEvents, actionEvents in some kind of global listener for all events ?
2) Persisting the captured data: Once the data is available, I would need to persist them into a database. But I would want to do this in a way that the overhead is not very much and doesn't slow down the application very much. So, could you suggest a way to capture this data in a asynchronous fashion so that the logging doesn't slow down the application. Or maybe aggregate the data in the user session and only do the logging once in a while.
Can anyone suggest how do I achieve the above requirement. Thanks in advance.
JSF is a web-based system, and therefore essentially batch-oriented. So attempting to capture individual control event timings is futile. No communications take place between client and server unless either a command is initiated (commandButton/commandLink), an AJAX request is fired, or an explicit URL request is made (usually from the user's browser navigation control).
In particular, timings on almost all listeners are meaningless, since most of them (valuechange, for example) are simply subroutines of the main command event. Value changes are not free-standing events, but rather they are indications that changes were seen in values when a command was initiated or AJAX request fired. They do not simply fire spontaneously when a user changes a control value (unless they have had AJAX capabilities attached to them).
Capture of the timing of actual HTTP request/response cycles is a lot easier. I do most of mine by simply using the Firebug plugin of my web browser. It displays the timings of all of the HTTP requests/responses associated with a page, since I'm mostly attempting to resolve end-to-end timing issues. You can often capture stats for the server by setting options in the server itself (Tomcat has Valve components that can be used for this).
To get fine-grained timings within an action handler method, you do the same thing that you'd do for non-web Java code. Use a profiler and/or manually add logic to capture timestamps of various points in the server-side code.
The actual use of a database to fetch and store data in a JSF webapp is something you should find in any decent JSF book. Although in fact, JSF has no built-in database awareness. You use databases in JSF code exactly the same way you would in non-JSF code.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.
You have to be odd to be #1 - Seuss. An odd little ad:
a bit of art, as a gift, the permaculture playing cards