Boa tarde,
preciso implementar uma tela que gere um relatorio apartir de uma consulta. O processo para buscar os dados é demorado, e portanto se faz necessário apresentar ao usuário uma tela de espera(do tipo loading…) até a carga de dados se completar.
Não sei se é a melhor solução , mas eu estou usando parcialmente um código retirado diretamente do fórum do ICEFaces, mas não está funcionando.
Tenho 2 questões:
-
Alguma sugestão de como implementar essa tela, OU conseguem identificar algo errado no código do meu back bean logo abaixo.
-
Nos exemplos do site do ICEFaces, o Back bean implementa a interface Runnable. Eu sei que existe uma recomendação da especificação para não se criar Threads em ambientes em EJB. Existe algum motivo relevante para isso? Ou apenas a filosofia de que quem deve gerenciar Threads é o servidor de aplicação?
Código(omitindo getter e setters):
public class RelatorioIrrecuperaveisBean implements Renderable, Runnable{
public final static int PROCESS_BUSCANDO = 0;
public final static int PROCESS_BUSCA_ENCERRADA = 1;
private Long tipoRelatorio = 0l;
private FiltroRelatorioIrrecuperaveis filtro = new FiltroRelatorioIrrecuperaveis();
private List<SelectItem> listaMotivoEnvioIrrecuperaveis;
@In(create=true)
RelatorioIrrecuperaveisBO relatorioIrrecuperaveisBO;
@In(create=true)
CdwEspelhoBO cdwEspelhoBO;
@In
private RenderManager renderManager;
private PersistentFacesState persistentFacesState;
private String sessionId;
protected static ThreadPoolExecutor longRunningTaskThreadPool =
new ThreadPoolExecutor(5, 15, 30, TimeUnit.SECONDS, new LinkedBlockingQueue(20));
private int estadoCorrente;
private boolean renderizaPopup;
@Create
public void init()
{
persistentFacesState= PersistentFacesState.getInstance();
sessionId = FacesContext.getCurrentInstance().getExternalContext().getSession(false).toString();
renderManager.getOnDemandRenderer(sessionId).add(this);
listaMotivoEnvioIrrecuperaveis = cdwEspelhoBO.buscaMotivosEnvioIrrecuperaveis();
}
public void geraRelatorio() {
estadoCorrente = PROCESS_BUSCANDO;
longRunningTaskThreadPool.execute(this);
//Codigo responsavel pela consulta que busca os dados para o relatorio
ByteArrayOutputStream relatorio = relatorioIrrecuperaveisBO.montaRelatorio(tipoRelatorio, filtro);
JSFUtil.getSession(false).setAttribute("relatorio", relatorio);
JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "window.location=\""+JSFUtil.getServletContext().getContextPath()+"/export/xls/index.jsp?nomearquivo=Relatorio_CDRs_enviados_para_cdr_data_work_irrecuperaveis\";");
estadoCorrente = PROCESS_BUSCA_ENCERRADA;
}
public PersistentFacesState getState() {
return persistentFacesState;
}
public void renderingException(RenderingException arg0) {
}
@Asynchronous
@Transactional
public void run() {
setRenderizaPopup(true);
try {
while (estadoCorrente != PROCESS_BUSCA_ENCERRADA){
Thread.sleep(600);
if (renderManager != null)
renderManager.getOnDemandRenderer(sessionId).requestRender();
}
} catch (InterruptedException e) {
FacesMessages.instance().add("A geração do relatorio foi interrompida");
e.printStackTrace();
}finally {
setRenderizaPopup(false);
}
}
}