Lista de Sessões

Caros companheiros, gostaria de saber se existe algum objeto tipo FacesContext, ExternalContext ou Application que me retorne um List, para o meu sistema ter um controle de todas as sessões abertar, para por exemplo listar todos os usuários online. Caso não haja qual seria a melhor forma de faze-lo???

Brother, qual é o Web Server utilizado?
Não sei qual o grau de profundidade necessário com relação as sessões, mas os próprios webservers fazem este controle de sessão.

Já trabalhei com uma solução que a principio parece ser melhor, mas acaba se tornando extremamente complexa.
Foi criada uma classe Bean contendo todos os atributos de sessão do usuário (nome, cpf, telefone, etc)…
E conforme o usuário navegada pela aplicação, estas informações eram mantidas em memória.
Foi algo criado manualmente, mas confesso ser extremamente complexo e de custo elevado com relação a memória.

Caso esteja utilizando Tomcat, Websphere ou outro webserver, recomendo dar uma olhada no site, pois certamente estes fazem um controle mais simples de sessão.

Espero ter ajudado.

Caro amigo, obrigado pela resposta. Minha plataforma de trabalho é a seguinte: netbeans 7, tomcat 7, jsf 2 e jpa 2. Entendi que o servidor web faz este controle, mas como eu poderia acessar estas informações de meu código. Como eu disse estou precisando ter um controle dos usuarios online. Estava pensando na seguinte solução:

@ManagedBean
@ApplicationScoped
public class Application{

List sessões = new ArrayList

}

cada vez que fosse iniciada uma nova sessão esta seria armazenada no me Application.
Será que daria certo???

[quote=clarinetabest]Caro amigo, obrigado pela resposta. Minha plataforma de trabalho é a seguinte: netbeans 7, tomcat 7, jsf 2 e jpa 2. Entendi que o servidor web faz este controle, mas como eu poderia acessar estas informações de meu código. Como eu disse estou precisando ter um controle dos usuarios online. Estava pensando na seguinte solução:

@ManagedBean
@ApplicationScoped
public class Application{

List sessões = new ArrayList

}

cada vez que fosse iniciada uma nova sessão esta seria armazenada no me Application.
Será que daria certo???[/quote]
Você poderia implementar o listener que toda vez que uma sessão for criada seu método será invocado: http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

Brother, eu realmente não utilizaria uma lista de sessão.

Não sei quantos usuários acessam seu aplicativo simultaneamente, mas isso pode vir a causar lentidão e até queda no servidor devido a alta utilização de memória.
Outro aspecto a ser considerado é a segurança, pois qualquer falha mínima na codificação pode fazer com que um usuário visualize informações de outro.
O risco de criar-se uma lista de sessões é que se houver algum problema com 1 usuário, os outros 3000 que estiverem online podem ser afetados.
Qualquer falha pontual, pode vir a afetar o aplicativo como um todo.

Caso isso seja implementado vários outros pontos devem ser refletidos, e entre nós, isso vai dar dor de cabeça no aspecto de manutenção, posteriormente.

Não sei qual é o nível de controle de usuários e sessão que vc deve estabelecer, mas existem algumas soluções menos complexas:

Caso vc necessite apenas visualizar os usuários online, existe o seguinte método na classe HttpSession:
Com ele, vc poderá verificar o ultimo acesso do usuário e desenvolver uma lógica em cima disso.

HttpSession session = request.getSession();
long ultimoAcesso = session.getLastAccessedTime();

Caso outros aspectos tenham de ser considerados, recomendo a utilização do banco de dados.
Qndo o usuário fazer login, um campo binário no banco de dados é alterado para TRUE e qndo sair FALSE.
As demais informações podem ser armazenadas em uma tabela SESSAO, contendo hora de ultima entrada, trilha de auditoria, dentre outros.

Acredito que para esta questão existem várias soluções a serem discutidas e levadas em consideração.
Um tempo perdido diante desta discussão certamente minimizará dias posteriores de manutenção.

Espero ter ajudado.
Poste aqui tua solução para que todos vejam.
Boa sorte.

[quote=BrunoFurtado]O risco de criar-se uma lista de sessões é que se houver algum problema com 1 usuário, os outros 3000 que estiverem online podem ser afetados.
Qualquer falha pontual, pode vir a afetar o aplicativo como um todo.[/quote]
Mano, tem algum erro de experiencia desse tipo? Ou sabe de algo? Nunca ouvi falar disso não, me interessei. =D

Opa,

Cara, eu nunca enfrentei erros, mas já participei de várias manutenções ou projetos que foram bastante complexos devido a utilização de soluções similares.

Vou tentar explicar meio por cima…

A aplicação da empresa necessita funfar 24 horas por dia, 7 dias por semana.
Para isso existia uma infraestrutura que continha 2 grandes servidores.
Ao entrar na aplicação, o usuário era redimencionado para um dos dois servidores, através de um procedimento de balanceamento de carga (visando performance).
Caso um servidor enfrentasse problemas, por exemplo queda de energia, todos os usuário era redimencionados ao outro servidor.
Como todos sabemos, normalmente, os webservers fazem o controle de sessão, e ao cair a energia, tudo que estava naquele servidor era perdido, incluindo a sessão e as informações do usuário (solicitações, produtos, tempo de login, entre outros).
Neste caso isso não ocorria, pois as informações de sessão dos usuários estavam em uma base de dados independente dos servidores web.
Portanto, ao ser redimencionado, o usuário nem sentia a falha, o servidor de contigencia apenas fazia a busca novamente na base de dados e tudo ocorria normalmente de forma transparente.

Isso era uma necessidade exclusiva da empresa, que recebia multa em caso de falhas e similares. Além disso não era utilizado servidores web, mas portais web (que contém pequena quantidade de memória), existiam 1500 usuários simultâneos e outras particularidades.

Axo que este seria um caso extremo, dai o surgimento de uma infraestrutura extremamente complexa e custosa com relação a manutenção e surgimento de novos projetos.

Blz. Valeu.