Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Uso de thread sleep

Olá,

Eu tenho um processo agendado que inicialmente precisa checar no banco de dados uma informação e caso não tenha o valor necessário ele aguarda 10 minutos e tenta de novo. Eu fiz uma implementação numa classe @stateless usando thread sleep, porém eu vi que não é uma boa idéia usar esse modelo. Como poderia fazer esse tipo de processo?

8 respostas

Não sei se entendi o que vc quis dizer, mas a minha dica é: utilize a anotação @Schedule. Quando obter o resultado, notifique o usuário por meio de um modelo de notificações, igual ao que o site da Alura possui, ou envio de email, sei la. Tem que ser assíncrono esse processo, já que depende de atualização de dados provenientes de outro processo. Manter uma conexão ativa por 10 min. seria realmente complicado.

Outra abordagem é você utilizar javascript para que faça uma chamada ajax a cada período de tempo a um serviço que confira se o valor que precisa está disponível. Assim você não obstrui a página. Se é que está trabalhando com um sistema web.

Olá Alex,

Na verdade não fica 10 min a conexão aberta, eu fiz um loop e ele faz uma consulta na base e me retorna um valor se ele não atender a condição de saída ele entra em sleep e depois volta no loop.

Resumindo a solução atual, ele tem uma chamada cron usando quartz que chama uma classe EJB e essa classe tem o loop que falei. Acontece o agendamento do quartz não tenha a condição ainda para continuar o processamento. Por conta disso esse verificador.

Eu pensei em extrair esse método que verifica a condição para uma classe @Singleton com o método @Asynchronous, só não sei se seria o mais correto.

Cara... parece uma implementação bem específica. Tivemos, aqui onde trabalho, um caso em que precisávamos efetuar um processamento de dados de forma assíncrona. Utilizamos Message Driven Bean (http://docs.oracle.com/javaee/6/tutorial/doc/gipko.html).

Na época, tentamos utilizar o @Singleton e @Asynchronous em conjunto com o agendamento via @Schedule, mas tivemos problemas com transações no banco. Como as regras eram muito complexas vários erros apareceram, até que passamos a utilizar MDB e a coisa funcionou bem melhor. Compensa dar uma olhada.

Olá Alex,

Vou dar uma olhada no documento, mas no meu caso o processo não é complexo, ele só precisa verificar no banco de dados se ele tem permissão de continuar o processamento.

Bom, nesse caso, acho que o uso de um @Singleton com agendamento vai atender mesmo. Não vejo porque não utilizar esse tipo de abordagem. Ao que me parece, vc ta no caminho certo, na minha opinião.

Obs.: Não sou especialista, to aqui aprendendo tb, então, continue buscando alternativas.

=/

Boa tarde,

Recomendo você dar uma olhada no capítulo de agendamento de tarefas no curso de EJB aqui da Alura. Aula 8.

Lá mostra a forma que a API de EJB te da para controlar de quanto em quanto tempo uma tarefa é executada. E já é controlado de forma performática pelo container, não precisa se preocupar com conexão aberta, etc.

Abraço.

@alex

Tamo junto eu também estou aprendendo :)

@Emerson Eu vi porém eu tenho o quartz que faz o agendamento e não consigo tirar ele do jogo. Outro ponto é que mesmo sem ele o processo só pode rodar uma vez por dia e quando uma condição que vem do banco de dados é atendida. Por ter essa condição no banco de dados não posso deixar um looping sem um sleep por que o dba me mata se fazer uma chamada no banco depois de poucos segundos durante até umas 2 horas sem parar.

solução!

Só voltando o feedback o que resolveu nesse caso foi usar o singleton mesmo. Obrigado a todos que ajudaram :D