Data de postagem: Oct 20, 2010 1:58:20 PM
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:
Segue abaixo a descrição de cada campo do dataset acima:
Campo
expired
id
creation
lastAccess
maxInactiveTime
maxLifeTime
enviromentType
realm
persistence
threadId
userKey
userName
profilerName
ip
forwardedfor
Descrição
Indica 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.
Indentificador da sessão ou SessionID
Data e hora em que a sessão foi criada
Data e hora em da última utilização da sessão.
Tempo máximo de inatividade da sessão. Se este tempo for extrapolado, a sessão será marcada como expirada.
Tempo máximo de vida da sessão. Se for 0(zero) a sessão terá tempo ilimitado de vida.
Indica o tipo de ambiente da sessão. Sessões stateful, quando autenticadas, são associadas a um único usuário.
Realm da sessão
Tipo de persistência da sessão
Identificador da thread que está utilizando a sessão. Se a sessão não estiver em uso, o valor será 0(zero).
Chave do usuário que se autenticou na sessão.
Nome do usuário que se autenticou na sessão.
Nome do perfil da sessão
IP do cliente ou do proxy, se o cliente estiver usando um servidor de proxy.
Se 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:
ip
IP do Proxy 03
forwardedfor
IP do Cliente, IP fo Proxy 01, IP do Proxy 02