[RESOLVIDO]Como enviar email a partir de hora fixa

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

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

1 curtida

vlw!

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

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

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

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

1 curtida

Funcionou!!