Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Proper design / architecture for a servlet-wide lobby and messaging?
First of all, I must say that Vaadin looks to be one of the best kept secrets on the internet. I can't believe I didn't know about this before, and I will be sure to spread its praises around Stackoverflow in the future. :)
I was wondering if anyone knew of a design pattern for the 'proper' architecture of a global ServletContext 'lobby'?
What I have so far would work in a single JVM instance: synchronized singleton. It holds a list of references to every user's ApplicationContexts. We add users on contextInitialized. We can also add listeners and then broadcast servlet-wide messages, as in the IT Mill Go Game. Is this basically a Blackboard Pattern for the entire servlet container?
I don't want to reinvent the wheel. If JavaEE containers provide user authentication and management, and Vaadin can use that, then is a better Java EE 6 way of doing this?
I'm not exactly sure I understand the question, but are you saying that you'd like to store somewhere a list of all the logged-in users? If so, I don't get how you're using the ServletContextListener. Instead, I'd imagine you'd implement HttpSessionListener and store the web app context as you go (though I don't know if it's been created at that point yet or not). Something like:
@WebListener
public class MySessionListener implements HttpSessionListener {
// An EJB annotated with @Singleton, but if you're using just a
// servlet container than you can do a Holder.getInstance() call
// in the business methods below. Make sure everything is
// thread safe!
@EJB SessionHolderBean sessionHolder;
@Override public void sessionCreated(HttpSessionEvent event) {
// store session or app context in sessionHolder
sessionHolder.store( .... );
}
@Override public void sessionDestroyed(HttpSessionEvent event) {
sessionHolder.remove( .... );
}
}
But maybe you're storing the ServletContext object and you can just get that info directly from there? If so, I should probably know how by now...
If you're using container-managed authentication, I'm not sure there's any place in the code to get a list of logged-in users. You might want to ask on the users list for GlassFish. Even if you're not using GF, it's still the Java EE reference implementation and so the user's list is appropriate for API-level questions.
You're probably doing the most expedient thing already, but note that storing these in a singleton bean only works if you're not doing any clustering.
Cheers,
Bobby
Thanks Bobby, your posts and blog on Oracle have been a great resource. I am still learning Java EE 6 and Vaadin, so that's why my question might be a little unclear. Give me a day and I will repost with either a clarification, or a summary of what I've found.