Agendamento de tarefas usando Listener

Olá…

Fiz uma classe que extende TimerTask. Esta classe deve ser executada com um intervalo
de 24h a partir de um data determinada pelo usuario.

O agendamento eu faço utilizando ServletContextListener.
O problema é que assim que o método listener entra em ação a classe é executada também.

O desejado é que a tarefa seja executada utilizando o intervalo a partir da data selecionada.

public class AtualizaMoedasListener implements ServletContextListener {
	private final long humHora = 1000 * 60 * 60;
	//private final long tempo = 1000 * 20;
	public void contextDestroyed(ServletContextEvent event) {}

	public void contextInitialized(ServletContextEvent event) {
		Timer timer = new Timer();
		String horaInicio = null;
		long intervalo = 0;
		String intervaloOperacao = null;
		Properties 	properties	= new Properties();
		InputStream	fis = getClass().getClassLoader().getResourceAsStream("sic.properties");
		try {
			properties.load(fis);
			fis.close();
			horaInicio = properties.getProperty("horaInicioOperacaoDownloadMoedas");
			intervaloOperacao = properties.getProperty("intervaloHorasOperacaoDownloadMoedas");
			int hora = Integer.parseInt(horaInicio.substring(0, 2));
			int minuto = Integer.parseInt(horaInicio.substring(3));
			
			intervalo = humHora * Integer.parseInt(intervaloOperacao);
			GregorianCalendar calendar = new GregorianCalendar();
			calendar.set(GregorianCalendar.HOUR, GregorianCalendar.HOUR_OF_DAY);
			calendar.set(GregorianCalendar.SECOND, 0);
			calendar.set(GregorianCalendar.HOUR_OF_DAY, hora);
			calendar.set(GregorianCalendar.MINUTE, minuto);
			
			timer.scheduleAtFixedRate(new AtualizaMoedas(), calendar.getTime(), intervalo);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Então dando um exemplo: Eu configurei que a data de início seria às 08:00.
Então a execução da tarefa (AtualizaMoedas()) deveria ser realizada somente as 08:00 do dia seguinte.
O que acontece atualmente é a execução seguindo este padrão mas também ocorre a execução da tarefa
assim que o TomCat entra no ar.

Como configurar corretamente o agendamento e impedir a execução da classe AtualizaMoedas no
start do TomCat?

Valeu!!!

Olá amigo,

experimente o quartz para agendar tarefas, é um excelente scheduler.

http://www.opensymphony.com/quartz/

[]'s

Eu conheço, inclusive li sobre mas como quase tudo tá funcionando, prefiriria continuar usando
o schedule do Java mesmo

ola amigo,

tente fazer:

timer.schedule(new AtualizaMoedas(), seconds*1000);

O problema desta abordagem é que eu só digo o tempo entre as execuções. Se eu usar deste jeito
se eu por exemplo subir a aplicação as 17:00 o tempo de repetição vai ser considerado tomando
como base 17:00.
Eu preciso dizer a hora em que desejo executar a tarefa. Então se eu usando calendar configurar
pra rodar as 08:00 e subir o TomCat as 17:00 a tarefa só vai ser executada as 08:00 do dia seguinte.