资讯专栏INFORMATION COLUMN

执行定时器报空指针异常

zhichangterry / 1914人阅读

我遇到的问题是启动定时器,然后在跟数据库交互的地方报错,Exception in thread "Timer-1" java.lang.NullPointerException。后来检查了一下是因为,dataAcquisitionVoMapper没有正常注入,原始代码如下:

package com.hqgd.pms.controller.Timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;

import javax.annotation.Resource;

import com.hqgd.pms.common.SpringContextUtil;
import com.hqgd.pms.dao.dataAcquisition.DataAcquisitionVoMapper;

public class UpdateTableTimer extends TimerTask {
    @Resource
    private DataAcquisitionVoMapper dataAcquisitionVoMapper;

//    public UpdateTableTimer() {//从bean工厂里拿个实例
//        this.dataAcquisitionVoMapper = SpringContextUtil.getBean(DataAcquisitionVoMapper.class);
//    }

    @Override
    public void run() {
        // 获取当前时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, -1460);
        String lastTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
        Map param = new HashMap<>();
        
        for (int i = 1; i <= 4; i++) {
            param.put("lastTime", lastTime);
            param.put("table", "hq_equipment_monitor_data_r" + i);
            dataAcquisitionVoMapper.deleter(param);//此处报空指针异常,是因为dataAcquisitionVoMapper没有正常注入
        }
        for (int i = 1; i <= 4; i++) {
            param.put("tabler", "hq_equipment_monitor_data_r" + i);
            param.put("tablef", "hq_equipment_monitor_data_f" + i);
            dataAcquisitionVoMapper.insertt(param);

        }
    }

}

报错提示如下:

在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。和上面的代码对比,需要添加下面框框里的代码,就是上面代码注释掉的部分,

SpringContextUtil工具类的代码如下:

package com.hqgd.pms.common;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description: 获取bean对象的工具类
 * @Author: yaorong
 * @CreateDate: 2018/12/10
 */

@Component
public class SpringContextUtil implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param 
     * @return
     */
    public static  T getBean(Class clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param 
     * @return
     */
    public static  T getBean(String name, Class clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

好了,问题解决!!!

小小菜鸟,如有不正确之处,请指正!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74848.html

相关文章

  • Spring Boot支持Crontab任务改造

    摘要:虽然本身支持定时任务,但都是服务一直运行时支持。监听目标对象借助容器刷新事件来监听目标对象即可,可以认为,定时任务其实每次只是执行一种操作而已。 在以往的 Tomcat 项目中,一直习惯用 Ant 打包,使用 build.xml 配置,通过 ant -buildfile 的方式在机器上执行定时任务。虽然 Spring 本身支持定时任务,但都是服务一直运行时支持。其实在项目中,大多数定时...

    fou7 评论0 收藏0
  • 一次排查多线程引发Java DNS缓存的Bug

    摘要:问题描述最近通知应用在近三个月内出现过次缓存的问题,第一次在重启之后一直没有出现过问题,所以也没有去重视,但是最近又出现过一次,看来很有必要彻底排查一次具体的错误日志如下具体表现就是出现此异常之后连续的出现大量此异常 问题描述最近通知应用在近三个月内出现过2次DNS缓存的问题,第一次在重启之后一直没有出现过问题,所以也没有去重视,但是最近又出现过一次,看来很有必要彻底排查一次;具体的错...

    cocopeak 评论0 收藏0
  • # 后端开发技巧、常用规范

    摘要:在任务被拒绝添加后,会调用当前线程池的所在的线程去执行被拒绝的任务。会让被线程池拒绝的任务直接抛弃,不会抛异常也不会执行。 开发技巧 equals() 方法的使用...

    Eirunye 评论0 收藏0
  • 从零开始学 Kotlin 之「2」数据类型

    摘要:前言大家好,这里是从零开始学之数据类型,本文首发于公众号,欢迎前往大家关注。输出布尔类型中的布尔类型用表示,它的值有和。若需要可空引用时,布尔类型的值会被装箱。此时程序会抛出异常最后从零开始学之数据类型到这里就结束了。 前言 大家好,这里是「从零开始学 Kotlin 之『2 』数据类型」,本文首发于公众号「Binguner」,欢迎前往大家关注。我会每周分享一些关于 Android 和...

    Awbeci 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<