software‎ > ‎módulos‎ > ‎engine‎ > ‎perguntas frequentes‎ > ‎

Como fazer para 'matar' uma sessão usando o sessionManager?

postado em 20 de out de 2010 06:58 por Usuário desconhecido   [ 5 de nov de 2010 12:16 atualizado‎(s)‎ ]
Uma sessão do Engine consome uma quantidade considerável de memória, pois nela é armazenada todo o ambiente JavaScript(variáveis globais, objetos, etc...).

Cada sessão possui um tempo de vida máximo definido em X-Class. Este tempo é contado a partir do momento em que a sessão fica inativa(sem uso). A propriedade this.session.maxSessionInactiveTime é usada para realizar esta configuração.

Entretanto, pode ocorrer que um usuário feche o browser e abra-o novamente criando outra sessão. Com isso haverá duas sessões para o mesmo usuário, sendo que uma delas não estará em uso e pode até ser 'matada', mas ela não será excluída de imediato por que ela deve aguardar a expiração do tempo máximo de inatividade.

Para resolve este tipo de problema, foram publicados nas versões 10.2.2.8 e 10.2.3.5 métodos no objeto sessionManager que permitem 'matar' sessões.

Veja como:


//O parâmetro "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
//é o sessionID da sessão que será 'matada'.

engine.sessionManager.dropStatefulSession(
  "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
)


O comando acima marca uma sessão stateful para ser coletada pelo garbage coletor, ela não é excluída de imediato. Há aí uma latência de mais ou menos 20segs.

Há também um comando para 'matar' sessões stateless. Veja:

engine.sessionManager.dropStatelessSession(
  "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
)


Mas de onde eu pego o sessionId e como sei se uma sessão é stateful ou stateless?

Há um método chamado getStatistics() que trás as informações sobre as sessões criadas no Engine em um DataSet. Veja:

//Ao executar o comando abaixo
engine.sessionManager.getStatistics()

//Será retornado um DataSet semelhante a este:
 expiredid
 creationlastAccess 
maxInactiveTime
maxLifeTime
enviromentType
realm 
persistence
threadId
userKey
userName
profileName
ip
forwardedFor
 N5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A1020/10/2010 10:56:34
20/10/2010 10:58:30
1800
0
stateless
Enginelet_RunScript
none
0
-1

DESENVOLVE
  
 NF09AC0E776621CFB2CE6E237DE42B6FAA8C7BDE6F98FA5E3B8B7B21ED267F92920/10/2010 11:15:53
20/10/2010 11:17:54
18000
stateful
WUI
none
0
-1

DESENVOLVE
127.0.0.1
 
 N96518B001BACA9624D48BC2170ADB957A4DC19853F4C189EB5FEF64B2017C4EE20/10/2010 11:02:43
20/10/2010 11:04:20
18000
stateful
WUI
none
0
-1
 DESENVOLVE
127.0.0.1
 

Segue abaixo a descrição de cada campo do dataset acima:
 CampoDescrição
 expiredIndica de a sessão está ou não expirada. 'S' Indica que a sessão expirou e 'N' indica que a sessão não expirou.
 idIndentificador da sessão ou SessionID
creation
Data e hora em que a sessão foi criada
 lastAccessData e hora em da última utilização da sessão.
 maxInactiveTime 
Tempo máximo de inatividade da sessão. Se este tempo for extrapolado, a sessão será marcada como expirada.
maxLifeTime
Tempo máximo de vida da sessão. Se for 0(zero) a sessão terá tempo ilimitado de vida.
enviromentType
Indica o tipo de ambiente da sessão. Sessões stateful, quando autenticadas, são associadas a um único usuário.
 realmRealm da sessão
 persistenceTipo de persistência da sessão
 threadIdIdentificador da thread que está utilizando a sessão. Se a sessão não estiver em uso, o valor será 0(zero).
 userKeyChave do usuário que se autenticou na sessão.
 userNameNome do usuário que se autenticou na sessão.
 profilerNameNome do perfil da sessão
 ipIP do cliente ou do proxy, se o cliente estiver usando um servidor de proxy.
 forwardedforSe o browser cliente estiver usando servidores de proxy, esta propriedade será preenchida com uma lista de IPs separados por vírgula começando pelo IP do cliente e seguido pelos IPs dos proxy. Obs: O proxy mais próximo do servidor não aparecerá nesta lista. Ele ficará registrado no campo ip.

Segue abaixo um exemplo para melhor compreender:

Seja a hipotética requisição abaixo:
Cliente --> Proxy 01  --> Proxy 02 --> Proxy 03 --> Servidor

Para esta requisição será criada uma sessão cujo os campos ip e forwardedfor seram preenchidos da seguinte forma:
 ipforwardedfor
IP do Proxy 03
 IP do Cliente, IP fo Proxy 01, IP do Proxy 02