Nós passamos por um problema curioso no projeto que eu estou trabalhando aqui no UOL. Nós tinhamos
um processo batch que estava configurado para rodar todos os dias as 3:00 da manhã. Esse processo
batch era iniciado via scheduler do Jboss. O problema é que surpreendentemente o processo ao invez
de rodar as 3:00 da manhã, começpi a rodar as 4:00 da manhã sem nenhum motivo aparente.
A configuração estava feita da seguinte forma:
<mbean code="org.jboss.varia.scheduler.Scheduler" name="jboss.docs:service=MyScheduler"> <attribute name="TimerName">jboss:service=MyTimer</attribute> <attribute name="SchedulableClass">br.com.uol.MyScheduler</attribute> <attribute name="StartAtStartup">true</attribute> <attribute name="DateFormat">dd/MM/yyyy HH:mm</attribute> <attribute name="InitialStartDate">01/01/2006 03:00</attribute> <attribute name="SchedulePeriod">86400000</attribute><!-- Roda uma vez por dia --> <attribute name="InitialRepetitions">-1</attribute> <depends>administration:custom=MyJMX</depends> <depends> <mbean code="javax.management.timer.Timer" name="jboss:service=MyTimer"/> </depends> </mbean>
Foram levantadas hipóteses que o horário da máquina estava configurado errado, que o timezone estava errado, que
o horário de verão estava configurado errado etc. A gente investigou uma por uma e tudo estava OK.
Até que começou a fase do desespero, de começar a etapa de tentar resolver o problema por tentativa e erro, e dessa
forma, descobrimos o problema.
Por uma razão desconhecida, se o campo “InitialStartDate” é configurado para alguma data dentro do horário de verão,
ele só inicia no horário correto quando estamos no horário de verão. Para resolver esse problema, nós apelamos
e mudamos este campo para 01/09/2006, e finalmente o scheduler começou a rodar conforme esperado, as 3:00 da manhã.
Fica aí a dica para caso alguém também passe por este problema. A versão do JBoss usada é 4.0.4_GA.
É impressionante como horário de verão sempre traz problemas, mesmo a cada ano a gente cercando cada vez mais, sempre
tem algum efeito colateral!
[]‘s e até a próxima.
Olá…
Muito interessante esse caso, realmente algumas coisas intrigam a gente. Eu mesmo tenho um problema, que seria muuuuuito simples de resolver, não sei se vc pode me ajudar nessa.
Ainda sobre timers, configurá-lo de tal forma que ele seja sincrono, ou seja, eu tenho um timer que roda a cada 5 segundos, por questão de performance preciso desse tempo curto, para que os processos não demorem a ser processados. No entanto, quando o onTimeout é disparado percebi que o timer ainda fica contando em memória, e se por acaso eu ainda não terminei o processo dentro do onTimeout, o novo onTimeout entra novamente no processo.
Isso é ruim, porque acaba “encavalando” um processo em cima do outro. O ideal, seria que a thread desse uma parada, até que eu terminasse o processo anterior.
Hoje, eu faço uma gambi… enorme. Dentro do Timer EJB, no método onTimeout() eu faço um cancel do timer, e antes de sair do método eu recrio ele novamente, mas acho isso muito feio.
O que vc me recomendaria, nesse caso de timer sincrono ?
Att.
Edson.