Timer uma vez por mês, tem como?

Fala galera,

Tenho um aplicativo java que tem algumas rotinas que são disparadas de tempos em tempos.

Algumas rotinas são de 5 em 5 minutos, outras uma vez por dia.

Mas tenho duas que são apenas 1 vez por mês, uma seria no dia 1 de cada mês e a outra no dia 2 de cada mês.

Esse é meu código para disparar uma delas.

        long periodo = 86400*1000; 

        Calendar vFull = Calendar.getInstance();
        vFull.set(Calendar.DAY_OF_MONTH, 2);
        vFull.set(Calendar.HOUR_OF_DAY, 5);
        vFull.set(Calendar.MINUTE, 0);
        vFull.set(Calendar.SECOND, 0);
        Date timeVFull = vFull.getTime();

        Timer timerVFull = new Timer();
        timerVFull.schedule(new VRoutineFull(), timeVFull, periodo);

Aqui uso um periodo de 24 horas para disparar novamente o timer, uso essa variável para todas as outras rotinas, para estanciar apenas uma.
Usando o Calendar coloco o dia do mês, porque só quero que rode dia 2 as 5 da amanhã.

Mas essa rotina roda todo santo dia, inclusive em horas alternadas, hoje por exemplo rodou ás 11:00.

Qual o problema desse timer?

já usei também o método scheduleAtFixedRate e deu na mesma.

Pensei em em fazer uma variável periodo de 1 mês, mas imaginem que meu servidor cai no dia 15, se começar a contar do dia 15 essa rotina vai rodar sempre dia 15, isso é estranho.

O que estou fazendo de errado?

[]'s

O quartz faz o que você quer:

http://www.google.com.br/#hl=pt-BR&safe=off&q=quartz+scheduler&oq=quartz+scheduler&aq=f&aqi=g3&aql=&gs_sm=e&gs_upl=3867l5274l0l5392l9l9l0l6l6l1l228l428l1.1.1l3l0&bav=on.2,or.r_gc.r_pw.&fp=d9ee582617bd5ee7&biw=1456&bih=774

Acho que até eu implementar algo novo no projeto é mais fácil fazer uma verificação pra ver se é dia 1 ou 2 a cada 24 horas e rodar o script.

Achei que fosse algum bug ou algum método do Timer que eu não estava usando, não tem solução esse Timer?

[]'s

use o scheduleAtFixedRate e quando for setar a data, coloque o mes tambem, assim ele so vai disparar no mes correto. dae vc pode colocar pra dormir o equivalente a um mes, encerrar a task e criar novamente no mes seguinte

Mauricio,

Mas se eu colocar o mês, por exemplo, mês 10, ele só vai disparar nesse mês?
e o restante do ano?

não entendi essa solução.

bom, a solução correta seria usar o Quartz.
Agora se vc quiser usar o timer, toda vez que executar a tarefa vc deve agendar ela novamente. Quando sua tarefa rodar, assim que ela terminar, ela mesmo agenda uma nova tarefa para o mes seguinte. entendeu?

Se voce estiver em um ambiente JEE, pode usar o Timer Service com um Stateless Bean.