Tela de espera - ICEFaces e duvida sobre Thread em EJB

0 respostas
Sefo

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:

  1. Alguma sugestão de como implementar essa tela, OU conseguem identificar algo errado no código do meu back bean logo abaixo.

  2. 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);
		}
		
	}

}
Criado 8 de novembro de 2010
Respostas 0
Participantes 1