zoukankan      html  css  js  c++  java
  • TimerTask的run()方法里面如何调用service层里面的方法

    在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 对象的。

  • 相关阅读:
    前端构建工具gulpjs的使用介绍及技巧
    mysql /*! 50100 ... */ 条件编译
    linux 硬连接与软连接
    Linux 数据流重定向
    倒排索引
    sed 常用的功能
    linux mysql安装
    mysql help
    linux 命令行选项
    mysql 主主复制的配置流程
  • 原文地址:https://www.cnblogs.com/boomoom/p/9136557.html
Copyright © 2011-2022 走看看