Quartz定时任务,无法注入Service以及Dao层

项目场景:

项目场景:在定时任务具体任务代码中,注入Service层Bean,操作数据库,注入失败,发生NPE


问题描述

无法在具体任务代码中,注入Service服务,ServiceBean为null
在这里插入图片描述

方式一:加入一行代码在execute

        // 方式二 方式二有些人可以 我失效
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

方式一对我失效,用的是方式二解决

解决方案:

加入quartz监听类

package com.jqmkj.ulp.listener;
 
import org.quartz.SchedulerException;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Component;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
 
/**
 * @author nzh
 * @date 2022/8/23 17:14
 */
@Component
public class QuartzServletContextListener extends QuartzInitializerListener {
 
    public static final String MY_CONTEXT_NAME = "servletContext";
 
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        super.contextDestroyed(sce);
    }
 
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        super.contextInitialized(sce);
        ServletContext servletContext = sce.getServletContext();
        StdSchedulerFactory factory = (StdSchedulerFactory) servletContext
                .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
        try {
            factory.getScheduler().getContext()
                    .put(QuartzServletContextListener.MY_CONTEXT_NAME, servletContext);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Job实现类中添加代码

package com.jqmkj.ulp.utils;

/**
 * @author nzh
 * @date 2022/8/19 8:11
 */

import cn.hutool.core.date.DateUtil;
import com.jqmkj.ulp.listener.QuartzServletContextListener;
import com.jqmkj.ulp.service.IUlpDataService;
import lombok.SneakyThrows;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.SchedulerException;
import org.springframework.web.context.WebApplicationContext;

import javax.servlet.ServletContext;


public class RealTimeJob implements Job{


    // @Autowired
    // IUlpDataService dataService;

    @SneakyThrows
    @Override
    public void execute(JobExecutionContext jobContext) {
        // 方式一 方式一有些人可以 我失效
        // SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        
        // 方式二
        ServletContext context = null;
        try {
            context = (ServletContext) jobContext.getScheduler().getContext()
                    .get(QuartzServletContextListener.MY_CONTEXT_NAME);
        } catch (SchedulerException e1) {
            e1.printStackTrace();
        }
        WebApplicationContext cxt = (WebApplicationContext) context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
        //要注入的Service服务 通过getBean去拿
        IUlpDataService dataService = (IUlpDataService) cxt.getBean("ulpDataServiceImpl");
        
        // UlpDataVO ulpDataVO = dataService.getActualTimeInfo(UlpYukeConsts.TOPO_ID);
        // UlpDataPO dataPO = CommonHelper.exchangePOJO(ulpDataVO, UlpDataPO.class);
        // dataService.save(dataPO);
        System.out.println("现在的时间是 : " + DateUtil.date());
    }
}

亲测有效,具体原因以后会了再来记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值