Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Escopo View com comportamentos inesperados

Uma coisa que me deixou bastante frustrado no jsf foi o View Scope quando percebi que nem sempre quando eu saia de uma view o beans não saia automaticamente da memória como o esperado e depois eu pude confirmar isso: http://showcase.omnifaces.org/cdi/ViewScoped

adicionei o DeltaSpike ao meu projeto e substitui os ViewScope por ViewAcessScope que tem o comportamento semelhante ao keepalive do richfaces e meus beans agora tem o comportamento esperado exceto quando o usuário fecha a aba do browser ou fecha o navegador e o bean permanece na memória.

1 - Esse lance do JSF ficar armazenando os view scopre na memória pode realmente prejudicar o sistema ou é neurose mesmo?

2 - O JSF não tem alguma forma de detectar que o usuário fechou o browser ou a aba e remover esse bean da memória?

1 resposta
solução!

Oi Ricardo, seus beans morrerão quando você realizar uma navegação através de actions ou quando acessar diretamente a URL através do navegador teclando ENTER. Se você acessa uma página e fecha a aba, a view continuará viva um tempo. Não se preocupe que ela irá expirar.

Quer fazer um teste? Abra a view no seu navegador e vá tomar um café demorado. Quando você submeter o formulário dessa view receberá um ViewExpiredException. Porém, não lembro de cabeça quando tempo a view ficará viva em memória.

JSF 2.X guarda apenas o delta (a diferença) da view, e não toda ela. Ele toma nota apenas do que mudou, tornando o uso de memória ainda menor no server.

Porém, se isso te incomoda muito, mas muito, você pode jogar o estado da view para o navegador. O padrão é server, você pode trocar para client. O ônus disso que é seu HTML ficará maior onerando um pouco a largura de banda do usuário, já que a view tem que ser enviada a cada requisição com o HTML do usuário.

No seu web.xml, pode colocar:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

Depois, reinicie o servidor e carregue a página. Exiba o código fonte dela. Lá estará a view serializada. Aqui é uma questão de tradeoff: eu onero o server ou o client? O que ganho nos dois casos? Tem que avaliar.

Se ainda você estiver cabreiro, pode usar o StatelessView do JSF 2.1/2.2 (não lembro qual versão entrou), Nela você não guarda estado na view e só pode usar escopo de requisição. Dá uma pesquisada nisso. Dê uma olhada em

http://www-01.ibm.com/support/knowledgecenter/SSRTLW_9.5.0/com.ibm.etools.jsf.doc/topics/tstatelessviewsinjsf2.2.html

No final, quem ditará se você terá problema ou não é o contexto de uso da aplicação.