• Java定时器内调用数据库查询信息---踩到的坑


    今天使用Java定时任务的时候遇到了一个坑,就是在使用定时器的时候,直接在定时器内操作了数据,结果报空指针异常,查了贴子才发现,原来是定时器内不允许操作数据,这里贴出了定时器内操作数据的实例,方便使用的小伙伴们早些弃坑

    定时器内不允许直接调用services层的方法来进行数据操作,所以我们可以直接将实现类的方法写到这个地方,实现直接调用方法的情况

    
    package com.zxjs.config;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.zxjs.dao.ComplaintsDao;
    import com.zxjs.entity.Complaints;
    import com.zxjs.service.ComplaintsService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    
    import javax.annotation.Resource;
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * @author nan
     * @date 2020/7/24 15:07
     */
    @Configuration
    public class ConfigClass implements InitializingBean {
    
        private final static Logger logger = LoggerFactory.getLogger(ConfigClass.class);
        @Autowired
        private static ComplaintsService complaintsService;
        @Resource
        private ComplaintsDao complaintsDao;
        /**
         * 项目开启的时候执行定时任务,用来检测投诉保存是否到达五天
         * @throws Exception
         */
        @Override
        public void afterPropertiesSet() throws Exception {
            /**
             * 延迟60秒启动,每一小时执行一次
             */
            try{
                new Timer("testTimer").schedule(new TimerTask() {
                    @Override
                    public void run() {
                        QueryWrapper<Complaints> wrapper = new QueryWrapper<>();
                        //查询的是信息类型是保存的类型
                        wrapper.eq("complaintsActionType",0);
                        List<Complaints> list = complaintsDao.selectList(wrapper);
                        for (Complaints complaints : list) {
                            //判断时长是否到达五天,到达的话获取这个数据的id改变这条数据为不显示状态
                            //先判断毫秒值是不是空,是空的话直接进行下一步
                            if(complaints.getComplaintsActionsMils() != null && !complaints.getComplaintsActionsMils().equals(null)&& complaints.getComplaintsActionsMils() != null){
                                if((System.currentTimeMillis() / 1000) - Long.parseLong(complaints.getComplaintsActionsMils()) > 432000){
                                    //0:显示;1不显示,设置为不显示
                                    //只有当显示为0的时候才会进行更新,这样可以减少数据库执行时间
                                    if(complaints.getComplaintsShow() != "1" && !complaints.getComplaintsShow().equals("1")){
                                        complaints.setComplaintsShow("1");
                                        complaintsDao.updateById(complaints);
                                    }
                                }
                            }
                            }}
                }, 60000,3600000);
            }catch (Exception e){
                logger.error(e.getMessage());
            }
        }
    }
    
    
  • 相关阅读:
    java 新建文本并写入
    批处理 获取相同进程的所有 pid
    io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: error:
    Linux下“/”和“~”的区别
    Error creating bean with name 'consoleConfig'
    2019 蓝桥杯省赛 B 组模拟赛 结果填空:马的管辖
    # Codeforces Round #663 (Div. 2)
    Codeforces Round #645 (Div. 2) A~D
    迷宫2 NC15196
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/nanstar/p/13406960.html
Copyright © 2020-2023  润新知