Bean chamar XHTML em evento

Boooom dia GUJeiros,

Estamos (dupla de TCC) com uma dúvida e gostaria de saber se é possível ou não realizá-la.

Em nossa aplicação (Primefaces + JSF), há um parte de identificação de chamadas através do RXTX.
Essa biblioteca fica com uma thread rodando direto e, quando uma ligação é recebida, o RXTX lança um evento.

Em resumo, gostariamos de abrir um Dialog em nossa página, apresentando quem está ligando (já conseguimos recuperar o cliente com base no telefone).

O problema que estamos tendo, é que o RequestContext.getCurrentInstance().execute("meuDialog.show()") não executa e simplesmente para o código do bean aí.

O que entendemos, é que conseguimos abrir um dialog, somente se vier uma requisição do XHTML.

Há alguma maneira de mandar uma resposta ao XHTML sem que ele nos mande uma requisição?

Agradecemos toda e qualquer ajuda (:

Pelo que entendi, você quer abrir um dialog em um contexto que não é de requisição.

Talvez você consiga isso através do Push, dá uma olhada no prime push:
http://www.primefaces.org/showcase/push/index.jsf.

Penso ainda em outra solução, você poderia por exemplo criar um @ManagedBean, e criar uma variável boolean “exibirDialog” quando essa Thread rodasse iria setar essa variável pra true. A você cria um poll (p:poll) na página que executa a cada 5s por exemplo dando update em um script q só seria renderizado nessa condição.

XHTML:

        <h:form>
            <p:poll update="@form :formDialog" process="@this" interval="5"/>
            <h:panelGroup rendered="#{bean.exibeDialog}">
                <!-- atendendo a condição esse script será renderizado -->
                <script>
                    meuDialog.show();
                </script>
            </h:panelGroup>
        </h:form>
        
        <p:dialog widgetVar="meuDialog">
            <h:form id="formDialog">
                <!-- conteudo a ser atualizado no dialog -->
            </h:form>
        </p:dialog>

Managed bean:

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean
@ApplicationScoped
public class Bean {

    private boolean exibirDialog;

    public void processar() {

        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    //lógica para setar dialog
                    //...
                    //exemplo
                    Thread.sleep(10000);
                    setExibirDialog(true);
                } catch (InterruptedException ex) {
                }
            }
        });

        thread.start();
    }

    public boolean isExibirDialog() {
        return exibirDialog;
    }

    public void setExibirDialog(boolean exibirDialog) {
        this.exibirDialog = exibirDialog;
    }
}

Nesse caso usei application scoped, não sei se é teu caso, talvez o session resolva.

Olá ayslanms!

Cara, seguindo esta sua primeira “opção” usando o Push, qual dos eventos você acha que se encaixaria neste caso ? Qual deles fica “escutando” o estado do ManagedBean?

Abraço
:wink:

Será que utilizando o Evento “Polling” não funcionaria? Como ele se comporta caso o usuário estivesse por exemplo “salvando um cliente”

<h:form id="form">  
    <h:outputText id="txt_count" value="#{counterBean.count}" />  
       
    <p:poll interval="3"    
            listener="#{counterBean.increment}" update="txt_count" />  
</h:form>  
package org.primefaces.examples.view;   
  
import java.io.Serializable;   
  
import javax.faces.event.ActionEvent;   
  
public class CounterBean implements Serializable{   
  
    private int count;   
  
    public int getCount() {   
        return count;   
    }   
  
    public void setCount(int count) {   
        this.count = count;   
    }   
       
    public void increment() {   
        count++;   
    }   
}   

Ainda não usei o Push, mas a idéia das notificações do servidor serem escutadas pela parte web acho que se encaixa nesse exemplo.
Acho que a solução poll também funcionaria.

Opa, valeu a ajuda.

Na verdade, hoje está com o pool. O problema que encontramos é que a imagem de loading fica aparecendo e, muitas vezes nao da tempo do diálogo renderizar…

O link do push nao abre, mas iremos pesquisar sobre…

alguma outra ideia, caso esta nao funcione?

Para remover a o loading do poll pode usar global=“false”:

<p:poll update="@form :formDialog" process="@this" interval="5" global="false"/>