[RESOLVIDO]Como enviar email a partir de hora fixa

39 respostas
programaçãowebjava
J

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 ?

39 Respostas

T

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.

M

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ê :+1:!

J

@TerraSkilll valeu pela ajuda, vou ver mais sobre o Quartz!

@Mike quais serão as importações necessárias?

M
import javax.ejb.Schedule;

import javax.ejb.Singleton;

import javax.ejb.Timer;

import javax.inject.Inject;

Aquela classe EmailService seria a sua classe

J

A classe emailService é onde esta o modo de envio do email?

M

Pode ser a sua classe que chama o DAO para receber os emails e você pode ter outra para enviar, ai vai de você.

J

Ok Obrigado!

A

Olá!

Se fosse todo dia as 10h… é só tirar a data?

Obrigado.

M

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”

A

vlw!

M

Se a sua classe de envio de e-mail estiver funcionando, da um toque aqui, to precisando também

R

@Mike

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();
    }
D

eu tenho um projeto que tem mais ou menos essa agendamento, no meu caso ele enviar email a cada 5 min .

M

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.

R

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 error

Caused 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

M

Posta seu código

R
/*
 * 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()");
    }
}
M

Você importou a classe Timer errada, a correta seria javax.ejb.Timer

R

Funcionou!!

M

Show!

Você esta tentando enviar email também?

R

Sim, mas eu estou utilizando um webService próprio da empresa.

M

Eu estava tentando enviar um e-mail mas não consegui e fui programar outra coisa

J

No meu projeto está dando um alerta para eu usar o persistent dentro do parênteses do @Schedule… Isso irá alterar o funcionamento ?

M

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

R

Eu fiquei sem entender o porque daquela variável também, já que ela não é utilizada.

Vou retirar então.

J

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 ?

M

Só você para dizer :slight_smile:

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

J

@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!!

M

Assim:

@Singleton
public class ClasseEJB {

	Classe classe = new classe();
	
	@Schedule(hour="23", minute="30", dayOfWeek="*", info="MyTimer")
    private void scheduledTimeout(Timer t) {
       classe.metodo();
    }
	
}
J

Qual é a versão da java EE utilizada no seu projeto ?

M

Java EE 7 + Glassfish 4.0

J

Estou usando o Java EE 7 + Apache Tomcat 8.0.27.0, mas ainda não funcionou haha

M

No Tomcat EJB não funciona

Tomcat é um container, para rodar EJB tem que ser servidor de aplicação.

J

E existe algum que funcione no tomcat ? Que você conheça claro

M

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.

J

Certo… Obrigado pela ajuda!

M

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

J

Vou procurar sobre isso entao!

J

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); 
}
Criado 23 de março de 2018
Ultima resposta 4 de abr. de 2018
Respostas 39
Participantes 6