TimerTask的run()方法里面如何调用service层里面的方法

时间:2022-01-15 19:22:19

在java的spring框架中,用Timer和TimerTask来实现定时任务,有时我们要在TimerTask的子类的重写run方法里,调用service层的方法。

但是不管是spring.xml配置的bean还是注解@autoware注入的bean,在执行的时候都会报空指针异常。

刚开始的代码:

代码一:TimerTask的子类

public class AbcTask extends TimerTask {
private AaaService aaaService; public void setAaaService(AaaService aaaService) {
this.aaaService = aaaService;
} @override
public void run() {
aaaService.delectSomething();
}
}

代码二:Timer.schedule()的调用类

public class Scheduler {

    public void timer0() {
    Timer timer = new Timer();
    t.schedule(new AbcTask(), 0, 1000 * 60 * 60 *24);
} }

代码三:spring.xml

<bean id="abcTask" class="...AbcTask" />
<bean id="scheduler" clas="...Scheduler" init-method="timer0" />

问题:TimerTask不是由spring管理的,所以 TimerTask 内部的 service 也无法自动注入。
解决:在spring的xml里,配置TimerTask bean对象,把它交由spring管理; 再把这个bean作为scheduler 的传入参数。
修改过后的代码如下:

代码二:Timer.schedule()的调用类

public class Scheduler {
private AbcTask abcTask; public void setAbcTask(AbcTask abcTask) {
this.abcTask = abcTask; public void timer0() {
    Timer t = new Timer();
t.schedule(abcTask, 0, 1000 * 60 * 60 *24);
  }
}

代码三:spring.xml

<bean id="abcTask" class="...AbcTask" />
<bean id="scheduler" clas="...Scheduler" init-method="timer0">
<property name="abcTask" ref="abcTask"/>
</bean>

记一点:遵循 spring 管理的前提下,一定是不能 new 对象的。