| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2010 14:38:31
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
Pessoal, como vcs fazem para controlar o número de usuários logados em um sistema ? Preciso restringir um máximo de usuários logados simultaneamente por questões de performance.Pensei em várias coisas mas acho que estou pendendo para uma solucao via banco de dados mesmo.. o que vcs acham ?
This message was edited 1 time. Last update was at 04/10/2010 09:32:49
|
Sun Certified Java Programmer 5 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2010 14:55:24
|
sulito
Virtual Machine Man
Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline
|
Isso depende ne????
estas a usar o que?? (Desktop, web ( jsf1, jsf2, struct)??? etc.
|
LPI-101 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2010 21:36:25
|
Flavio machine
JavaEvangelist
![[Avatar]](/images/avatar/d9092432cf93294c7d6d2e076c6a3fdf.jpg)
Membro desde: 02/04/2008 13:24:56
Mensagens: 485
Offline
|
Cara ja pesquisou por poll de conexões ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2010 22:18:11
|
Lucas Emanuel
GUJ Master
Membro desde: 09/08/2009 23:48:57
Mensagens: 1143
Localização: Heap
Offline
|
Se for Web, voce pode usar o HttpSessionListener
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/10/2010 09:29:29
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
Lucas, realmente eu resolvi utilizando o HttpSessionListener. Vou postar a solução aqui assim que possível para quem se interessar. Mas obrigado a todos pela ajuda.
This message was edited 1 time. Last update was at 04/10/2010 09:32:26
|
Sun Certified Java Programmer 5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/10/2010 10:08:58
|
mrbbm
JavaChild
Membro desde: 16/12/2009 14:49:58
Mensagens: 125
Offline
|
muldon wrote:Lucas, realmente eu resolvi utilizando o HttpSessionListener. Vou postar a solução aqui assim que possível para quem se interessar. Mas obrigado a todos pela ajuda.
Pô cara, posta aí!
Estava procurando por isto nos últimos dias!
Grato!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/10/2010 10:22:41
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
mrbbm. Ficou legal, da pra controlar cada usuario na sessao em um Map e manter um controle de quantas sessoes abertas, barrar por ex mais de X usuarios logados ao mesmo tempo, etc.. estou em curso agora mas hj ainda a tarde eu ja posto ok !
|
Sun Certified Java Programmer 5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/10/2010 10:32:55
|
mrbbm
JavaChild
Membro desde: 16/12/2009 14:49:58
Mensagens: 125
Offline
|
Blz! Ficarei acompanhando o tópico!
Valeu irmão..
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2010 09:01:54
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
mrbbm desculpe pela demora mermao, mas ai vai ! ( Pela segunda vez pq o GUJ fez o favor de dar refresh na pagina antes de eu terminar a resposta... )
Eu tenho um ambiente maven, Spring 2.5 e Struts 2. Mas essa solução serve para qualquer ambiente Java Web. No seu web.xml adicione o listener:
Esse SessionListener é uma classe que implementa a interface HttpSessionListener, que possui 2 métodos importantes: sessionCreated() e sessionDestroyed(). Eles são invocados quando uma sessao é criada e destruida respectivamente. Veja o código abaixo:
Ok. O sessionManager é um bean singleton que irá centralizar minha lógica de controle de usuários na sessao. Então no meu applicationContext.xml do Spring eu tenho:
Ou seja, todos os beans com scopo de sessão, ao serem criados ou destruidos o container do servidor irá invocar esses métodos de criacao e destruicao da sessao através do listener. No meu caso eu tenho um bean chamado userSettings com scopo de sessao. Nesse Bean eu tenho as informacoes do usuario que me interessam. Agora veja o código do SessionManager:
Agora aqui está a questão. Eu preferi fazer da seguinte forma: quando o usuário cai na minha tela de login, meu userSettings com scopo de sessao sera invocado pelo Spring. Logicamente o metodo sessionCreated é invocado e eu decidi já colocar no meu map de usuários esse id de sessao, mesmo com o usuario sem logar. Quando o usuário loga, no meu método de login eu invoco :
ou seja, registrei no meu map um usuário preenchido ( previamente através de uma query... ). Logicamente o usuário é aquele que anteriormente já foi colocado na sessao, eu sobrescrevo ele no map ( pois o id da sessao é o mesmo ). Ao deslogar eu tenho:
. Não tem problema se o usuário sair sem deslogar. Quando a sessao expirar o método sessionDestroyed do listener sera invocado de toda forma, garantindo o controle da sessao. Já fiz todos os testes e a solução parece que resolveu meu problema. Tenho agora como saber exatamente quantas sessoes estao criadas no momento e quantos usuários estão logados. Logicamente o container não chama o método exatamente no momento que a sessão é destruida, as vezes demora um pouco mais, mas ele chama uma hora ou outra. Da pra ter um controle legal e consistente, o que resolve o problema de carga. No meu método de login eu resolvi barrar mais de 2 usuários logados, então a primeira verificação foi a seguinte:
Se o usuário tentar logar e já tiver 2 usuários, o sistema emite uma mensagem de erro. Logicamente o número 2 foi escolhido para testes. Bom, espero ter ajudado. Qualquer dúvida posta ai ! Abraço !
|
Sun Certified Java Programmer 5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2010 09:20:54
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
uma dúvida:
o timeout padrão de uma sessão é de 20 minutos...
se os dois usuários logados fecharem o browser sem deslogar, o próximo usuário terá que esperar 20 minutos pra usar o sistema?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2010 09:31:32
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
AbelBueno sua dúvida é pertinente. O timeout é configurado no web.xml.
No cenario anterior sim ( deveriam aguardar os 2 usuários até a sessão expirar ). Mas logicamente não teremos esse cenario em produção. No meu caso haverá 500 slotes disponíveis devido à restrições de arquitetura, então esse tempo será bem menor. Juntamente a isso, meu tempo de expiração como pode ver é de apenas 10 minutos. Considerando esses dois fatores não espero que o usuário em época de pico precisará esperar mais de 1 min. Se voce observar isso é comportamento da web quando se tem restrições, como é o meu caso ( a instituição nao me deu condicoes orcamentarias de fazer uma clusterizacao ). O site do Banco do Brasil tem lógica parecida, note que a expiração deles é de uns 3 min.
|
Sun Certified Java Programmer 5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2010 09:50:11
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
Não sei o volume de sua aplicação, é dificil comentar. Mas no pior caso, seu usuário ainda teria que esperar 10 minutos.
Como sugestão eu deixaria a sessão com 1 minuto no web.xml e criaria um mecanismo de "keep-alive".
Isso eliminaria qualquer chances do usuário esperar mais de 1 minuto quando houver slots disponíveis.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2010 10:02:02
|
muldon
JavaTeenager
![[Avatar]](/images/avatar/5f25fbe144e4a81a1b0080b6c1032778.png)
Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline
|
na verdade meu tempo de expiracao varia conforme a época. Na época de pico eu diminuo para 3 minutos. Mas dependendo do que o usuário estiver fazendo eu mantenho um "keep alive" na aplicacao para nao expirar a sessao enquanto o usuario está pensando ou preenchendo formularios etc. Mas quanto a espera, já pensei também em um mecanismo de fila, dizendo ao usuário quanto tempo ele terá de esperar e tudo mais.. mas nao acho que seja preciso tudo isso...
|
Sun Certified Java Programmer 5 |
|
|
 |
|
|