Até tenho um aplicationContext.xml, mas será usado pro spring security, já não queria usá-lo pra não ficar muita coisa em xml, agora veio essa ai do spring mail pra atrapalhar. =/
Abraço!!
@Component
//@ApplicationScope?
public class MailSenderFactory implements ComponentFactory<MailSender> {
// instancia um JavaMailSenderImpl, seta as propriedades e guarda num field
public MailSender getInstance() {
return mailSender;
}
}
Oi Lucas!!
Antes de usar o spring mail, tô fazendo o teste do scheduler com commons mail, só falta resolver este probleminha pra dar certo.
Está injetando nulo o DAO de contatos:
INFO: Server startup in 3910 ms
13:40:00,090 ERROR [JobRunShell ] Job DEFAULT.schedulerJob threw an unhandled Exception:
java.lang.NullPointerException
at br.com.imobiliaria.quartz.SchedulerTask.run(SchedulerTask.java:40)
at br.com.imobiliaria.quartz.SchedulerJob.executeInternal(SchedulerJob.java:28)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
13:40:00,092 ERROR [ErrorLogger ] Job (DEFAULT.schedulerJob threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:227)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: java.lang.NullPointerException
at br.com.imobiliaria.quartz.SchedulerTask.run(SchedulerTask.java:40)
at br.com.imobiliaria.quartz.SchedulerJob.executeInternal(SchedulerJob.java:28)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
... 1 more
23/09/2010 13:40:36 org.apache.coyote.http11.Http11Protocol pause
INFO: Pausing Coyote HTTP/1.1 on http-8080
23/09/2010 13:40:37 org.apache.catalina.core.StandardService stop
A linha SchedulerTask.java:40 é esta:
List <Contato> contatos = contatoDAO.listaContatos();
A lista funciona pq estou usando em outras classes, já tentei anotar o costrutor com @Autowired e não deu certo, continua injetando nulo. =/
Sabe o que pode ser?
Abraço!!
Eu tive que criar o construtor vazio pq ele acusava erro, dizendo que não existia o construtor, mesmo existindo o construtor preenchido, doidera. O.o
Aí tentei mandar uma anotação @Autowired no construtor preenchido, mas nem se abalou. =/
Acho que têm alguma coisa errada no tutorial, a classe Runnable possui método run(), a classe que herda possui método schedule(), beleza, agora a classe MyFirstApplicationTask acusa:
The type MyFirstApplicationTask must implement the inherited abstract method Runnable.run()
Não está enxergando o método schedule() da classe Task. Ai neste método:
public void schedule(TaskScheduler scheduler) {
scheduler.schedule(this, new CronTrigger("0 0 23 * * *")); // aqui
//Neste caso, a task rodará sempre às 23h0min0s
}
Manda esta mensagem:
The method schedule(Runnable, Trigger) in the type TaskScheduler is not applicable for the arguments (MyFirstApplicationTask, CronTrigger)
Agora ferrou, preciso sobrescrever esse método que está como Trigger para CronTrigger, como posso fazer isso Lucas?
Então, o autor fez uma herança lá, está assim:
Runnable << Task << ApplicationTask <-- MyFirstApplicationTask
Onde << é herança e <-- é implementação da interface. O component MyFirstApplicationTask deveria enxergar o método na interface Task:
public interface Task extends Runnable {
void schedule(TaskScheduler scheduler);
}
Está ignorando este método e exigindo o método run() na Runnable. =/
The method schedule(Runnable, Trigger) in the type TaskScheduler is not applicable for the arguments (Newsletter, CronTrigger)
O método schedule está esperando trigger, mas o autor da receita usou CronTrigger (que é o que eu queria usar mesmo), como ele conseguiu essa façanha?? O.o
@Component
@ApplicationScoped
public class MyFirstApplicationTask implements ApplicationTask {
public MyFirstApplicationTask(TaskScheduler scheduler) {
//Aqui você poderá receber componentes que não estejam em
//escopo de request ou session
...
this.schedule(scheduler);
}
public void schedule(TaskScheduler scheduler) {
scheduler.schedule(this, new CronTrigger("0 0 23 * * *")); // aqui espera trigger e ele colocou CronTrigger.
//Neste caso, a task rodará sempre às 23h0min0s
}
}
A minha classe Newsletter:
@Component
@ApplicationScoped
public class Newsletter implements ApplicationTask {
public Newsletter(TaskScheduler scheduler) {
this.schedule(scheduler);
}
public void schedule(TaskScheduler scheduler) {
scheduler.schedule(this, new CronTrigger("0 0 23 * * *"));
//Neste caso, a task rodará sempre às 23h0min0s
}
}
Agora não entendi este construtor dentro do MyFirstRequestTask:
Criei essa classe e manda implementar o método run() tb, não tô entendendo com funciona isso não. Se já tenho a MyFirstApplicationTask, pra que essa outra?
Abraço!