JBoss Timer Service

Olá!

Estou tentando criar um Timer service no JBoss, mas algo está um pouco nebuloso para mim. Leio o mesmo artigo que está publicado em JBoss.org em todas as referências sobre o assunto que já pesquisei até agora, no entanto, aquilo não está solucionando meu problema.

Creio eu que desejo desenvolver algo simples. Meu objetivo é usar um Timer MBean para disparar a execução de uma determinada classe a cada N unidades de tempo, que é o funcionamento básico de um daemon. Ok. Timer MBean, mole. TimerService igualmente mole.

Agora, como eu subscrevo a minha classe para receber as notificações do Timer?

Eu implementei uma classe com NotificationListener e coloquei alguns System.out.println’s para simplesmente ver se funcionava a notificação a cada 5 segundos, no caso. Nada acontece. Desta forma, tudo me leva a crer que não basta apenas implementar NotificationListener, mas também preciso subscrever minha classe as notificações de um determinado Timer através de alguma configuração.

Algum dos senhores saberia me dizer como realizar esta configuração?

Agradeço desde já.

Felipe Gabriel

O Timer Service, até onde eu sei é parte da spec do JEE.

Não sei se o JBoss implementa o Timer Service como deveria.

Lembre-se de que o JBoss 4.2.2 é uma implementação ‘meia-boca’ do JEE 5, e é cheio de furos.

Uma coisa que funciona bem nele é o Quartz, que dispara de acordo com uma configuração equivalente a do chron dos sistemas Linux / Unix.

Veja um exemplo de MDB:

@MessageDriven(activationConfig={
	@ActivationConfigProperty(propertyName="cronTrigger", propertyValue = "0/60 * * * * ?")
})
@ResourceAdapter("quartz-ra.rar")
public class QuartzMessageDriven implements Job {

	public void execute(JobExecutionContext jobExecutionContext) {
				// Seu código aqui
	}

}

Com essa configuração vai disparar a cada 60 segundos.

gcobr,

Deu um erro estranho…

[quote]— MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM —
ObjectName: jboss.j2ee:jar=RelogioEJB.jar,name=MonitorMDB,service=EJB3
State: FAILED
Reason: org.jboss.deployment.DeploymentException: Required config property RequiredConfigPropertyMetaData@17366cb[name=destination descriptions=[DescriptionMetaData@1670cc6[language=pt]]] for messagingType ‘javax.jms.MessageListener’ not found in activation config [ActivationConfigProperty(destinationType=javax.jms.Queue), ActivationConfigProperty(cronTrigger=0/60 * * * * ?)] ra=jboss.jca:service=RARDeployment,name=‘jms-ra.rar’[/quote]

… alguma idéia?

Agradeço desde já.

Felipe Gabriel

Uma maneira que fizemos foi criar um servlet que implementa o metodo init e que é responsavel pela chamada de criação do Timer.

O Timer é um objeto dentro de um EJB Stateless, e a classe Timer é um recurso injetado pelo container

        @Resource
        TimerService timerService;

Para criar o timer use

	public void criaTimer(Long intervalo, String nome) {
		timerService.createTimer(0, intervalo, nome);
	}

E o metodo que será executado contem o @Timeout

Abraços