EJB TimerService sincronizado

Olá pessoal, implementei o TimerService com sucesso, porém devido a regras de negócio esse timer precisa ser executado a cada 5 segundos.

Até aí sem problemas, o caso é que pode ser que o processo inserido dentro do timeout leve um tempo maior pra ser executado fazendo assim com que um próximo timeout seja disparado e o método seja chamado novamente sem que o anterior tenha sido executado completamente.

Eu até que consegui fazer uma “gambi”, ou seja, ao entrar no timeout eu deleto o timer, e recrio novamente ao final do processo.

Existe uma maneira mais profissional de se deixar o timer SINCRONIZADO ? uma espécie de “semáforo”. Já pesquisei, e vi pessoas com o mesmo problema, mas sem resposta.

Obrigado.

Até onde eu sei, a especificação EJB não permite que o desenvolvedor faça isso. Como dica, você poderia criar uma algoritmo que recebesse e verificasse os objetos do timeout e nesse algoritmo você trabalharia com concorrência.

Pensei nisso rafael, porém eu teria que criar um objeto estático e setar alguma propriedade nele, tipo “running=true”, e a cada evento, checar essa informação.

Quanto ao que vc disse, sobre não ser “permitido”, qual das práticas EE eu violei ? :expressionless:

É uma saída.

Não é que não seja permitido, apenas a especificação EJB menciona para não utilizar threads.

Oi Rafael, não usei threads não. Utilizei os recursos da própria especificação EJB, os TimerServices.

Quanto ao singleton, não sou muito fã, por isso acabei não usando. Para suprir isso, como estou com esta aplicação rodando num JBoss 5.0 (e não pretendo mudar tão cedo) acabei usando os recursos de ServiceMBean (aquele… anotado com @Management), dessa forma eu tenho um “singleton” que suporta Cluster.

Mas, é que eu realmente tava interessado em saber se existia ou não alguma propriedade do TimerService que pudesse ser configurado, de forma a deixar sincrono os eventos de timeout (@Timeout).