Minha aplicação tem uma agenda e preciso criar alarmes para avisar o usuário quando alguma atividade vencer.
Estou tentando utilizar a biblioteca Quartz e estou tendo dificuldades em agendar os alarmes.
Minha ideia inicial é, quando o usuário entrar na aplicação, o sistema listará todas as atividades pendentes e então criará Schedules com o Quartz para que dispare um alerta quando a atividade vencer.
Segue o teste que estou fazendo:
public static void main(String[] args) {
List<Atividade> atividades = new AtividadesDAO().listarAtividadesDia();
for (Atividade atividade : atividades) {
new TesteAgendamento().agendamento(atividade);
}
}
public class TesteAgendamento implements Job {
public void agendamento(Atividade atividade) {
try {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
String[] horaAtv = atividade.getHoraInicialAtividade().split(":");
int hora = Integer.parseInt((horaAtv[0])) + 1;
int idatv = atividade.getIdatv();
JobDetail job = JobBuilder
.newJob(TesteAgendamento.class)
.withIdentity(String.valueOf(idatv), "grupo01")
.build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(String.valueOf(idatv), "grupo01")
.withSchedule(CronScheduleBuilder.cronSchedule("0 " + horaAtv[1] + " " + hora + " * * ?"))
.build();
scheduler.getContext().put("idatv", idatv);
scheduler.getContext().put("atividade" + idatv, atividade);
scheduler.scheduleJob(job, trigger);
scheduler.start();
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void execute(JobExecutionContext context) {
try {
SchedulerContext schedulerContext = context.getScheduler().getContext();
int idatv = (int) schedulerContext.get("idatv");
Atividade atividade = (Atividade) schedulerContext.get("atividade" + idatv);
System.out.println("Atividade " + idatv + " - " + atividade.getDataInicialAtividade() + " " + atividade.getHoraInicialAtividade());
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
}
Ao entrar na aplicação, é feito uma consulta no BD de quantas atividades tem para vencer.
Se houver 3 atividades, deve criar 3 agendamentos (Scheduler) para informar ao usuário no momento do vencimento.
O código acima faz os 3 agendamentos (Scheduler) e chama exatamente no momento do agendado, porém sempre mostra o último horário agendado.
Exemplo:
“Agendamento 1 = 16:00”
“Agendamento 2 = 16:01”
“Agendamento 3 = 16:02”
O resultado fica:
Ás 16:00 o alerta é => “Agendamento 3 = 16:02”
Ás 16:01 o alerta é => “Agendamento 3 = 16:02”
Ás 16:02 o alerta é => “Agendamento 3 = 16:02”
Por favor, alguém poderia me dar uma ajuda com esta questão?
Muito obrigado