Tudo bem pessoal?
Peguei a dica do sérgio e fiz algumas coisas que deram certo, embora não seja exatamente o que eu queria. Explico:
O meu Job recebe beleza o httpSession, beleza.
A questão é: Se fosse o facesContext era fácil fazer a mensagem aparecer ao término do request, porque aí eu fazia alguma coisa do tipo FacesContext.getCurrentInstance().addMessage(null, facesMessage);
Acontece que o que eu tenho é a sessao http e quando meu job roda (depois de 3 minutos) o que eu posso fazer é colocar na sessao a mensagem que eu quero que apareça e assim surge o seguinte problema: A mensagem entra na sessao após os 3 minutos, mas como fazer ela aparecer no MESMO MOMENTO em que ela entra na sessão?
Digo “mesmo momento” porque se eu ficar olhando para a tela 3 minutos, esperando a mensagem aparecer, a gente vai constatar que a tela já havia sido renderizada para o usuario antes da mensagem estar na sessão, de modo que qdo ela entra na sessão (decorridos os 3 minutos) o componente que renderiza a mensagem já havia sido renderizado antes, num momento que não tinha mensagem nenhuma, e por consequentemente não aparece a mensagem.
Então, o problema fica resolvido em partes, porque só depois de outro request é que a mensagem poderá ser vista, ou seja, a pagina é renderizada novamente após a mensagem estar disponível para renderização e aí sim ela aparece.
Não gostaria de dar por resolvido não. Porque apesar de o usuário poder ver a mensagem só depois de decorrido os 3 minutos, isso fica condicionado a pelo menos um request adicional, e eu não posso garantir que meu usuário vai dar mais algum click depois que a mensagem tenha sido adicionada na sessão.
Espero que eu tenha me feito entender!
Mas estou mostrando abaixo o que eu fiz, quem sabe dá uma luz…
public class MyFacesMsgPerguntaCognicao extends FacesMessage implements HttpSessionBindingListener{
public MyFacesMsgPerguntaCognicao(String msg) {
super(msg);
}
public void valueBound(HttpSessionBindingEvent bindingEvent) {
System.out.println("syso=>SOU FacesMsgPerguntaCognicao, acabei de ser adicionada na sessao...");
HttpSession session = bindingEvent.getSession();
System.out.println("session:" + session.getAttribute("avisoPergutaCognicao"));
}
public void valueUnbound(HttpSessionBindingEvent bindingEvent) {
logger.debug("SOU FacesMsgPerguntaCognicao, acabei de ser retirada na sessao...");
}
}
Essa minha mensagem, devido à interface HttpSessionBindingListener fica sabendo qdo o meu Job coloca ela na sessao, de modo que agora eu tenho um método pra fazer alguma coisa no momento que a mensagem é colocada na sesão. A idéia seria fazer ela aparecer utilizando esse método. Como fazer isso? Dá pra fazer um refresh na página via esse método? Acho que pegar o meu managedBean pra setar um atributo pra aparecer via EL é meio inviável e cheira a gambiarra, não sei…
Alguém poderia dizer, faz um
<f:verbatim>
avisoPergutaCognicao
</f:verbatim>
ou algo mais adequado com El expression…
Mas, estou fazendo isso, o que realmente dá pra mensagem aparecer, só que eu tenho que esperar outro request do usuario e só entao isso acontece. TALVES SE COM ESSE METODO EU PUDESSE DAR UM REFRESH…
Resumindo, a mensagem está na sessão mas eu não queria esperar outra requisição do usuario para a mensagem realmente aparecer.
PS1.:
Viu marcelo, tentei sua idéia também, veja se fiz o que vc estava sugerindo:
Quando o usuario entra na sessão, tem um listener meu que coloca um objeto List vazio.
O Job quando executa, pela esse objeto e adiciona a mensagem:
if (httpSession != null){
String mensagem = "Passaram-se os 3 minutos, ";
MyFacesMsgPerguntaCognicao facesMessage = new MyFacesMsgPerguntaCognicao(mensagem);
httpSession.setAttribute(“avisoPergutaCognicao”, facesMessage);
List listDeMsgDaSessao = (List) httpSession.getAttribute(“listDeMsgDaSessao”);
listDeMsgDaSessao.add(facesMessage.toString());//toString porque e so pra teste!!!
httpSession.setAttribute(“listDeMsgDaSessao”, listDeMsgDaSessao);//estou recolocando pois alterei a referencia a nao o objeto em si
System.out.println(“JobAvisaUsuarioPerguntaConicao”);
System.out.println(“httpSession =! null”);
} else {
System.out.println(“JobAvisaUsuarioPerguntaConicao”);
System.out.println(“httpSession == null”);
}
O resultado é extamente o mesmo que o de antes, ou seja, um List de string e uma string tem o mesmo comportamento, mesmo que o List já esteja na sessao antes de ser adicionada a mensagem. Isso ocorre, creio, que seja porque qdo pego o List da sessao coloco numa variavel de referencia, usando a variavel de referencia altero o objeto;
Pessoal, me condenem pelos scriplets mas me ajudem por favor!!! Talvez haja um jeito mas fácil, não quero complicar.
Até mais, brigado pela atenção e desculpem se não estou enchergando algo que seja óbvio, porque as vezes acontece!