Temos um processamento grande

Pessoal, tenho um sistema que estamos migrando para jsf.

O sistema consta em importação de arquivos, com muitos processos e verificação.

No sistema antigo, o que acontecia. Os passos são:

  1. importo um arquivo (já está pronto em jsf),
  2. Clico em processar (já está pronto em jsf).
  3. Posso sair do sistema ou importar outro arquivo(Repetir passos 1 e 2). No jsf, ele fica com a imagem carregando e não consigo fazer nada até que o processamento termina.

No sistema atual tinha uma funcionalidade - Agendamento de fluxo no servidor, assim você pode iniciar vários processos de importação sem problema nenhum. isto é, o tudo rodava na camada servidor e banco sem interferir com o browser.

Como fazer algo semelhante em jsf ?

Caso não tenha entendido, só chamar.

1 curtida

Thread

2 curtidas

@guilhermebhte caso você não precise desse resultado de imediato (algo tipo exibir uma mensagem de “processamento finalizado” ou algo assim pro usuário) você pode utilizar threads (como disse o @igor_ks) ou mesmo utilizar um agendador de tarefas pra agendar esse processamento em background (talvez até agendando pra um horário em que não haja muito acesso ou mesmo enfileirando importações)…

Você está rodando essas ações em um application server, pode, plenamente, executar isso em um agendador ou mesmo pode executar em segundo plano.
Pelo que descreveu, você está atrelando a execução destas tarefas à sessão, logo, enquanto você tem a execução ocorrendo, a página ficará travada.
É como no java swing, se você executa algo demorado na mesma thread que trata o evento do botão, este botão ficará travado.

Você pode fazer o mesmo fluxo, importar o arquivo e clicar para processar. Ao clicar em processar, você pode utilizar um agendador de tarefas, como o Quartz e será realizado em paralelo, no caso em background. Outra alternativa se não precisar processar na hora, é colocar a tarefa de processamento para ser executando de X em X tempos, assim sempre ele irá verificar se possui algum arquivo para processar ou não e será feito todo o processo.
Outra alternativa citada é a utilização de Threads, onde ao clicar em processar você poderia criar uma com toda a regra de negócio do processamento.

@Eldius, @Luis_Augusto_Santos e @LucasFurlaneto

Preciso que este processo executa por baixo dos panos, isto é, o usuário não percebe, pelo agendador de tarefas, junto com threads, pois assim eles não ficam concorrentes.

@LucasFurlaneto, este http://www.quartz-scheduler.org/ é agendador de tarefas ?

Está usando JEE? Então você tem agendamento nativo de tarefas
Exemplo 1
Exemplo 2

Uma outra opção, caso você realmente tenha a necessidade de acompanhar na tela, seria o uso de websocket, mas, não sei se isso é viável para uma aplicação JSF.
Seria interessante dar uma pesquisada e ver se há essa alternativa.
Basicamente, o websocket ativaria o processamento e mesmo que você feche o browser, ao retornar, o mesmo poderá dar o status do andamento e, sendo o caso, notificar quando o processo for concluído.

Na verdade o único acompanhamento na tela que o usuário vai ver, é o aumento de porcentagem.

Exemplo o arquivo tem 2000 linhas

Acompanhando pela grade, que deve atualizar de 10 a 10 segundos.

Para o implemento de atualizar, vamos utilizar a extensão do timer.
https://www.primefaces.org/showcase-ext/sections/timer/basic.jsf

Assim a cada 10 segundos, a porcentagem será mostrada na grade e a linha atual.

Vou estudar o que me passaram e ver se consigo implementar.

Iniciando o processo do 0% e finalizando no 100%.

Sim Guilherme, o Quartz é um agendador de tarefas. Nele você pode configurar tarefas para serem executadas de várias formas, podendo ser de periodicidade, no caso seria de minuto em minuto, hora em hora, uma vez por dia, uma vez por semana, por mês e diversas outras possibilidades, tudo isso através de expressões Cron.
Você poderia fazer algo como: A cada X segundos verifica se possui algo para processar, ou se for algo que só é feito de vez em quando talvez seria mais interessante utilizar threads, onde criaria apenas quando fosse executado.

Então @LucasFurlaneto, no sistema atual o agendador de tarefas, roda de 10 em 10 segundos.

Faz uma consulta no banco e se tiver resultados, pega o primeiro arquivo e inicia o processo.

O usuário só ve a movimentação conforme tela no anexo.

Na tela do usuário tem um timer, tipo este, que atualiza de 10 em 10 segundos, assim o usuário pode sair do sistema, ir para outra tela e estes processos não param. Assim na tela tem uma tabela que está sendo atualizada pelo agendador, sendo a porcentagem, linha processada, etc…

O usuário só sabe se terminou após a porcentagem chegar a 100%.

Vou fazer os ajustes necessários.

Guilherme, neste caso o Quartz irá te atender muito bem, pois você pode criar as tarefas para serem executadas de 10 em 10 segundos e realizar todo o processo.
Se quiser, pode dar uma olhada neste post do blog da Caelum, é um pouco antigo, mas da para ter uma noção legal do framework.