Olá,
Estou desenvolvendo um PhaseListiner para previnir multiplos cliques no menu, e outras partes da aplicação. O grande problema está que quando eu chamo a ação:
facesContext.responseComplete();
O a4j:status nunca para, em qualquer outro momento da aplicação ele funciona corretamente, apenas quando eu chamo essa instrução o componente continua executando. Mesmo chamando outra requisição ajax
ele continua executando.
Alguem sabe alguma forma de eu conseguir dar um abort(); no Ajax? Ou conseguir forçar a parada do a4j:status?
<a4j:status>
<f:facet name="start">
<h:graphicImage value="imagens/#{telaPrincipal.pastaSkinPersonalizada}/loader4.gif" style="position: absolute; left:450px; top: 120px;" />
</f:facet>
</a4j:status>
public class MultipleClickPreventionPhaseListener implements PhaseListener {
private static Semaphore semaphore = new Semaphore(1);
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
public void beforePhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
if (phaseEvent.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
if (!semaphore.tryAcquire()) {
facesContext.responseComplete();
}
}
}
public void afterPhase(PhaseEvent phaseEvent) {
if (phaseEvent.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
if (semaphore.availablePermits() == 0) {
semaphore.release();
}
}
}
}
