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

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"/>