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

TimerTask的run()方法里面如何调用service层里面的方法的更多相关文章

  1. ssh框架,工具类调用service层方法

    解决方法: @Component//声明为spring组件 public class CopyFileUtil{ @Autowired private DataFileManager dataFile ...

  2. 【mybatis】service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据【事务的问题】

    问题描述: service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据 ...

  3. (网页)websocket后台调用Service层

    百度论坛里面有很多好的方法,借鉴. 重点:因为项目是StringBoot所以我用的是下面的方法很好使: Service.... service = (Service....) ContextLoade ...

  4. asp.net c#并行调用service层代码

    public ActionResult Home(AdviserSearchModel model) { //顾问列表需要的当前城市的下级地区 var ip = "117.82.196.19 ...

  5. SpringBoot在自定义类中调用service层等Spring其他层

    解决方案: 1.上代码 @Component public class ServerHandler extends IoHandlerAdapter { @Autowired protected He ...

  6. java中方法内可以调用同一个类中的方法

    在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.

  7. SpringAOP来监控service层中每个方法的执行时间

    使用AOP来说,太方便了,并且特别适合这类场景. 代码如下,这里是将要统计的信息写到log文件中,也可以设计成写入表中. package com.ecsoft.interceptor; import ...

  8. 在Java filter中调用service层方法

    在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...

  9. Spring main方法中怎么调用Dao层和Service层的方法

    在web环境中,一般serviceImpl中的dao之类的数据库连接都由容器启动的时候创建好了,不会报错.但是在main中,没有这个环境,所以需要获取环境: ApplicationContext ct ...

随机推荐

  1. java编程规范(持续更新)

    1:非空判断 错误例子: if(user.getUserName().equals("hollis")){ } 这段代码极有可能在实际运行的时候跑出NullPointerExcep ...

  2. linux的一些基本命令

    一.linux的一些基本命令(使用的是CentOS7系统): 1.创建用户组,创建新用户并添加到用户组 添加用户,添加用户组命令: 增加用户:useradd -d /usr/username -m u ...

  3. Android——Activity的简绍

    Activity Activity的运行机制其实和JavaEE中的servlet很像,而我们的Android系统也就相当与其servlet容器,Activity在其中进行创建实例.初始化.运行.销毁等 ...

  4. django migrate报错(提前删除表等)

    python3 manage.py makemigrations python3 manage.py migrate ##报错 改为##更改migrates的状态 python3 manage.py ...

  5. sublime text3安装代码格式化的步骤

    1.首先查看有没有安装package control插件,若没有,进行此链接操作——http://blog.csdn.net/kongguyoulan523/article/details/51144 ...

  6. Python自动化测试之selenium从入门到精通

    1. 安装selenium 首先确保python安装成功,输入python -V 在windows下使用pip安装selenium,详情如图所示: 在ubuntu下使用pip install sele ...

  7. vscode運行vue和html

    html 选中html文件,右键选择view in broswer.

  8. Python——管道通信

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Pipe,Process def func(conn1,conn2): conn2.close() whi ...

  9. C-Lodop提示“网页还没下载完毕,请稍等一下再操作.”

    该提示在Lodop旧版本中是: 提示"WebSocket没准备好,点确定继续",提示“C-Lodop没准备好”,新版本修改了该提示的描述“网页还没下载完毕,请稍等一下再操作.”,让 ...

  10. dom定位的三种元素

    1.通过id #XXX 2.通过标签  xxx 3.通过类  .xxx