Tenho uma aplicação web rodando, quero que quando for por exemplo 10h00 do dia 25/03/2018 seja enviado um email para todos os usuarios, como faço isso ?
Está usando algum framework web? Se sim, qual? veja se ele não tem algum componente de agendamento de tarefas.
Você também pode criar um módulo ou biblioteca à parte para isso, como o Quartz.
Abraço.
Um EJB TimerService resolve seu problema
@Singleton
public class EnviaEmailEJB {
@Inject
private EmailService emailService;
public EnviaEmailEJB() {
}
public void enviarEmail() {
}
@Schedule(hour="10", minute="00", dayOfMonth="25" ,month="3", year="2018", info="MyTimer")
private void scheduledTimeout(final Timer t) {
System.out.println("@Schedule called at: " + new java.util.Date());
enviarEmail();
}
}
Agora é com você !
@TerraSkilll valeu pela ajuda, vou ver mais sobre o Quartz!
@Mike quais serão as importações necessárias?
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Timer;
import javax.inject.Inject;
Aquela classe EmailService seria a sua classe
A classe emailService é onde esta o modo de envio do email?
Pode ser a sua classe que chama o DAO para receber os emails e você pode ter outra para enviar, ai vai de você.
Ok Obrigado!
Olá!
Se fosse todo dia as 10h… é só tirar a data?
Obrigado.
ai voce põem * no lugar do dia, mes e ano
dayOfMonth="*", month="*", year="*"
TALVEZ o valor default seja asterisco ja, ai não precisa por, mas fica mais facil de saber o que acontece só de bater o olho.
O asterisco (*) significa: “todos os valores”
vlw!
Se a sua classe de envio de e-mail estiver funcionando, da um toque aqui, to precisando também
Eu estou precisando da mesma coisa, só que não entendi muito bem seu exemplo.
Basta criar uma classe java, colocar o código abaixo e vai disparar qualquer coisa que eu queira na data que eu indicar? Não preciso ficar chamando o método scheduledTimeout em nenhum lugar? ou setar que isso deve ser executado?
Obrigado
@Schedule(hour="10", minute="00", dayOfMonth="25" ,month="3", year="2018", info="MyTimer")
private void scheduledTimeout(final Timer t) {
System.out.println("@Schedule called at: " + new java.util.Date());
enviarEmail();
}
eu tenho um projeto que tem mais ou menos essa agendamento, no meu caso ele enviar email a cada 5 min .
Boa tarde @Rodrigo_Marden
A classe tem que ser um EJB anotado com @Singleton, assim como postado acima
Seria uma classe normal, com a anotação @Singleton e com esse código modificado para atender a sua necessidade
@Schedule(hour="10", minute="00", dayOfMonth="25" ,month="3", year="2018", info="MyTimer")
private void scheduledTimeout(final Timer t) {
//Testando pra ver se esta tudo correto
System.out.println("@Schedule called at: " + new java.util.Date());
}
Não é necessário chamar o método, ele é invocado sozinho no horário que você determinar.
Boa tarde @Mike
Tentei realizar um teste aqui, mas na hora de iniciar o servidor, eu estou recebendo o seguinte erro:
Grave: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method
java.lang.RuntimeException: EJB Container initialization errorCaused by: javax.ejb.EJBException: Invalid @Timeout or @Schedule signature for: private void br.com.controlado.util.ScheduleService.scheduledTimeout(java.util.Timer) @Timeout or @Schedule method must return void and be a no-arg method or take a single javax.ejb.Timer param
Posta seu código
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.controlado.util;
import java.util.Timer;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.faces.bean.ViewScoped;
/**
*
*/
@Singleton
public class ScheduleService {
@Schedule(hour="15", minute="32", dayOfMonth="*", month="*", year="*", info="MyTimer")
private void scheduledTimeout(final Timer t) {
System.out.println("br.com.webService.ScheduleService.scheduledTimeout()");
}
}
Você importou a classe Timer errada, a correta seria javax.ejb.Timer
Funcionou!!