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

  • 相关阅读:
    聊聊Senior .net 面试,作为面试官你称职吗
    使用Microsoft BizTalk Adapter for mySAP Business Suite需要注意的一些限制点
    eos账号管理
    如何安装以太坊钱包Parity
    Infoq主办 Baidu Web 开发者大会记录
    http请求的详细过程转载
    php 下载保存文件保存到本地
    php section
    用javascript拼接html代码标签
    php使用sql数据库 取得字段问题
  • 原文地址:https://www.cnblogs.com/boomoom/p/9136557.html
Copyright © 2011-2022 走看看