Código
this.fecha = fecha; initTask(); }
O con el método set
Código
this.fecha = fecha; }
Con guava event bus también sirve, dependiendo que tan acoplado este tu código
Esta fecha futura es la que debemos de setear por lo antes nombrado
Código
tu comentas
Citar
Lo que no veo es como llamar desde la clase que gestiona el alta en base de datos a execTimer para pasarle la fecha en la que se debe enviar el correo.
justo en esa parte debería ver un trozo del código para ver que tal esta, recuerda que el método execute del TimerClass es donde debe ir tu logica cuando el usuario dispare algun evento
ver el entrypoint de tu aplicación es también importante.
Entonces refactorizando un poco crearemos nuestro builder para personalizar un poco homie, que se lo setearemos al método setTimeBean de la clase ExecTimer

el método toString le hacemos override para adaptarlo a nuestras necesidades

el string retornado es la expresión de cron
Código
@Override final StringBuilder stringBuilder = new StringBuilder() .append(sec) .append(" ") .append(min) .append(" ") .append(hour) .append(" ") .append(day) // requeridp .append(" ") .append(month) // requerido .append(" ") .append("?");// opcional el YEAR XD return stringBuilder.toString();
Código
package foro; public final class TimeBean { private final int sec; private final int min; private final int hour; private final int day; private final int month; private TimeBean(final Builder builder) { this.sec = builder.sec; this.min = builder.min; this.hour = builder.hour; this.day = builder.day; this.month = builder.month; } public int getSec() { return sec; } public int getMin() { return min; } public int getHour() { return hour; } public int getDay() { return day; } public int getMonth() { return month; } @Override final StringBuilder stringBuilder = new StringBuilder() .append(sec) .append(" ") .append(min) .append(" ") .append(hour) .append(" ") .append(day) .append(" ") .append(month) .append(" ") .append("?");// opcional el YEAR XD return stringBuilder.toString(); } public static class Builder { private int sec; private int min; private int hour; private int day; private int month; public Builder withSec(final int sec) { this.sec = sec; return this; } public Builder withMin(final int min) { this.min = min; return this; } public Builder withHour(final int hour) { this.hour = hour; return this; } public Builder withDay(final int day) { this.day = day; return this; } public Builder withMonth(final int month) { this.month = month; return this; } public TimeBean build() { return new TimeBean(this); } }
Un ligero cambio a la clase ExecTimer
Código
package foro; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Objects; public class ExecTimer { private JobDetail job; private Trigger trigger; private Scheduler scheduler; private TimeBean timeBean; public ExecTimer() { } public ExecTimer(final TimeBean timeBean) { this.timeBean = Objects.requireNonNull(timeBean,()->"TimeBean sin instanciar crear builder"); } public void setTimeBean(final TimeBean timeBean) { this.timeBean = Objects.requireNonNull(timeBean,()->"TimeBean sin instanciar crear builder"); } public void initTask() { try { job = JobBuilder.newJob(TimerClass.class) .withIdentity("EnviarMail") .build(); trigger = TriggerBuilder.newTrigger() .withIdentity("testing v1.1 para olimpico10", "group1") .withSchedule(CronScheduleBuilder.cronSchedule(timeBean.toString())) .build(); scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } catch (SchedulerException e) { e.printStackTrace(); } } }
Aquí esta clase ejecutara el ExecTimer a modo de ejemplo, tu puedes crear la tuya en tu proyecto para instanciar
Vemos 2 clases nuevas aquí ambas geniales con la nueva API de java.time
Código
private final ZoneId zoneId = ZoneId.of("Europe/Madrid"); private final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(),zoneId).plusSeconds(5);
Este método añade 5 segundos despues de el actual al String final o mejor dicho a la Expresion cron homie
Código
.plusSeconds(5);
Código
package foro; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; public class ExcuteTaskOnNext { private ExecTimer execTimer = new ExecTimer(); private final ZoneId zoneId = ZoneId.of("Europe/Madrid"); private final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(),zoneId).plusSeconds(5); public ExcuteTaskOnNext() { init(); } private void init() { final TimeBean timeBean = new TimeBean.Builder() .withSec(zonedDateTime.getSecond()) .withMin(zonedDateTime.getMinute()) .withHour(zonedDateTime.getHour()) .withDay(zonedDateTime.getDayOfMonth())//el dia es requerido .withMonth(zonedDateTime.getMonthValue()) //el mes es requrido .build(); execTimer.setTimeBean(timeBean); execTimer.initTask(); } new ExcuteTaskOnNext(); } }

Entonces vamos a lo siguiente tu me diras joderrr tiiioo, pero este chaval le digo mil veces que quiero mandar el fucking correo al mes siguiente

solo te tocara añadir esto

Código
plusMonths(1)
nuestro builder podemos configurarlo de la siguente manera, o sea, valido también, si unicamente vas a usar el envio mensual
Código
//para crear una tarea mensual el builder es valido asi segun cronmaker final TimeBean timeBean = new TimeBean.Builder() .withDay(zonedDateTime.getDayOfMonth())//el dia es requerido .withMonth(zonedDateTime.getMonthValue()) //el mes es requrido .build();
si colocamos la expresion originada gracias a la linea 54 de la clase TimeBean Expresion cron: 0 0 0 25 11 ?
en http://www.cronmaker.com/ tenemos

consta que debería crear el proyecto en struc2

La clase ExcuteTaskOnNext a sido renombrada RunNextTask , siendo una mejor versión
Código
package com.example.javamail.executarnextmonth; import com.example.javamail.util.GenericBuilder; import com.example.javamail.util.ShowData; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.ui.Label; import org.springframework.beans.factory.annotation.Autowired; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; @SpringComponent public class RunNextTask implements ShowData { @Autowired private ExecTimer execTimer; private ZonedDateTime zonedDateTime; private TimeBean timeBean; try { switch (tiposTiempos) { case SEGUNDOS: zonedDateTime = getZoneDateTime().plusSeconds(valueTime); timeBean = getTimeBeanBuilder(); break; case MINUTOS: zonedDateTime = getZoneDateTime().plusMinutes(valueTime); timeBean = getTimeBeanBuilder(); break; case HORAS: zonedDateTime = getZoneDateTime().plusHours(valueTime); timeBean = getTimeBeanBuilder(); break; case MESES: zonedDateTime = getZoneDateTime().plusMonths(valueTime); timeBean = getTimeBeanBuilder(); break; } getLogger().error(null,ex); } execTimer.setTimeBean(timeBean); label.setValue("Expresión cron "+timeBean.toString()); execTimer.initTask(); } /** * Metodo de uso opcional */ public void initTimeBeanMonth() { final ZoneId zoneId = ZoneId.of("Europe/Madrid"); final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(),zoneId).plusMonths(1); //para crear una tarea mensual el builder es valido asi segun cronmaker final TimeBean timeBean = GenericBuilder.of(TimeBean::new) .with(TimeBean::setDay,zonedDateTime.getDayOfMonth()) .with(TimeBean::setMonth,zonedDateTime.getMonthValue()) .build(); execTimer.setTimeBean(timeBean); execTimer.initTask(); } private ZonedDateTime getZoneDateTime() { return ZonedDateTime.ofInstant(Instant.now(),ZoneId.of("Europe/Madrid")); } private TimeBean getTimeBeanBuilder() { return GenericBuilder.of(TimeBean::new) .with(TimeBean::setSec,this.zonedDateTime.getSecond()) .with(TimeBean::setMin,this.zonedDateTime.getMinute()) .with(TimeBean::setHour,this.zonedDateTime.getHour()) .with(TimeBean::setDay,this.zonedDateTime.getDayOfMonth()) .with(TimeBean::setMonth,this.zonedDateTime.getMonthValue()) .build(); } }
donde invocaremos al método initTimeBuilder, con 3 parámetros
- El tipo de tiempo
- El retardo
- El label para mostrar la salida
Código
@Autowired private RunNextTask runNextTask;
Código
runNextTask.initTimeBuilder(tiempo, valueTime, labelExpresionCron);
eso estará contenido en la clase FormEmailSender.java
> Opción guiarse por aquí
https://foro.elhacker.net/java/envio_de_emails_programados_con_springboot_vaadin_8_quartz-t489066.0.html