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 ?
[RESOLVIDO]Como enviar email a partir de hora fixa
39 Respostas
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!!
Show!
Você esta tentando enviar email também?
Sim, mas eu estou utilizando um webService próprio da empresa.
Eu estava tentando enviar um e-mail mas não consegui e fui programar outra coisa
Esta dizendo para remover o final não? Pode remover
O método funciona com final, sem final ou sem parametro, mas se tiver paramentro, tem que ser javax.ejb.Timer
Eu fiquei sem entender o porque daquela variável também, já que ela não é utilizada.
Vou retirar então.
Aqui ele comenta para pôr o código dessa forma:
@Schedule(hour="8", minute="15", dayOfMonth="28", month="3", year="2018", info="MyTimer", persistent = false)
private void scheduledTimeout(final Timer t) {
JOptionPane.showMessageDialog(null, "Deu certo!");
}
Mas seu eu pôr assim irá trazer algum erro ?
Só você para dizer 
Eu utilizo eclipse e ele não me da nenhum warning.
A documentação diz: "Specifies whether the timer that is created is persistent."
Nunca utilizei o atributo persistent, mas eu acho que não dará problema algum
@Mike
Ok… Entendi, já criei a classe para testar, mas não executa quando dá a hora!
Como você criou a sua classe ? Desculpe tantas perguntas!!
Assim:
@Singleton
public class ClasseEJB {
Classe classe = new classe();
@Schedule(hour="23", minute="30", dayOfWeek="*", info="MyTimer")
private void scheduledTimeout(Timer t) {
classe.metodo();
}
}
Qual é a versão da java EE utilizada no seu projeto ?
Java EE 7 + Glassfish 4.0
Estou usando o Java EE 7 + Apache Tomcat 8.0.27.0, mas ainda não funcionou haha
No Tomcat EJB não funciona
Tomcat é um container, para rodar EJB tem que ser servidor de aplicação.
E existe algum que funcione no tomcat ? Que você conheça claro
Eu só fiz do jeito acima.
Uma outra solução seria criar uma Thread, executar um metodo nela e bota-la pra dormir por um tempo, ai quando acordar, executa de novo o metodo.
Certo… Obrigado pela ajuda!
Se não me engano, tem uma classe de Thread que executa métodos em um determinado intervalo, mas não sei exatamente qual é, talvez TimerTask (como o nome diz) ou ExecutorService, mas eu apostaria no primeiro
Vou procurar sobre isso entao!
Código que utilizei:
public static void executa() {
long TEMPO = (1000 * 60);//verifica a cada 1 minuto
Timer timer = new Timer();
TimerTask tarefa = new TimerTask() {
public void run() {
//Colocar aqui o código
}
};
timer.scheduleAtFixedRate(tarefa, TEMPO, TEMPO);
}


