Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Efeito esperado para @Singleton

Realizei um teste antes de trocar a classe AgendarEmailJob de @Stateless para @Singleton, tanto a primeira quanto a segunda anotação geram mensagens de warning quando o EJB tenta executar mais de uma vez o mesmo método, ou seja, quando o cenário descrito no vídeo ocorre.

21:25:30,001 WARN  [org.jboss.as.ejb3.timer] (EJB default - 2) WFLYEJB0043: A previous execution of timer [id=3e881742-cb43-4a99-a5d3-85f3d6931c68 timedObjectId=curso-alura-ejb.curso-alura-ejb.AgendarEmailJob auto-timer?:true persistent?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@5088914f previousRun=Thu Dec 10 21:25:22 BRT 2020 initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Thu Dec 10 21:25:30 BRT 2020 timerState=IN_TIMEOUT info=null] ScheduleExpression [second=*/10;minute=*;hour=*;dayOfMonth=*;month=*;dayOfWeek=*;year=*;timezoneID=null;start=null;end=null] is still in progress, skipping this overlapping scheduled execution at: Thu Dec 10 21:25:30 BRT 2020.

Isso é normal? Se sim, então qual a vantagem de utilizar @Singleton sendo que aparentemente @Stateless já está fazendo a verificação para não executar mais de uma vez o Job?

1 resposta
solução!

Marcus, bom dia. A diferença entre @Stateless e @Singleton está, na verdade, na criação dos objetos. No desenvolvimento da nossa aplicação não dará para ver muito este cenário, pois apenas nós fazemos requisição para a aplicação em desenvolvimento. Se fosse para produção, com um número de requisições pelos usuários aumentando, com o @Stateless seriam criados vários objetos de AgendarEmailJob, por mais que nas instâncias criadas, o job só fosse executado uma vez, não seria o comportamento que queríamos. O @Singleton, independente de quantos usuários estão requisitando a nossa aplicação, teríamos uma única instância desse objeto. Consegui esclarecer um pouco mais sua dúvida? =)