spring动态定时器,bean注入为null的问题解决

原创 2018年04月17日 17:17:43

首先说下具体配置:
pom文件:

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>

spring配置:

    <!--动态定时任务 -->
    <bean id="schedulerFactoryBean"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
        <property name="jobFactory" ref="myJobFactory"></property>
    </bean>

注意:以上jobFactory这个参数,就是解决问题的地方.重写了这个方法,使得可以注入spring的bean.

//重写方法
@Component(value="myJobFactory")
public class MyJobFactory extends AdaptableJobFactory {

    //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

以下是业务处理

//业务处理,并且是依靠spring注入的
@Component
public class EmergenceStartTask implements Job{
    @Autowired
    private EmergencyMapper emergencyMapper;

    private int aqi = 300;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDetail jobDetail = context.getJobDetail();
        String uuid = jobDetail.getKey().getName();
        if(aqi>200) {
            emergencyMapper.addAqiCount(uuid);
        }
    }
}

添加定时器任务工具:

    public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, String time) {
        try {
            JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);// 任务名,任务组,任务执行类
            @SuppressWarnings("unchecked")
            JobDetail jobDetail = newJob(cls).withIdentity(jobKey).build();
            TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器
            Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();// 触发器时间设定
            sched.scheduleJob(jobDetail, trigger);
            if (!sched.isShutdown()) {
                sched.start();// 启动
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

这里是业务处理层:

@Service
public class DynamicTaskServiceImpl implements DynamicTaskService {
    private static Logger log = LoggerFactory.getLogger(DynamicTaskServiceImpl.class);
    @Autowired
    private SchedulerFactoryBean SchedulerFactoryBean;

    // 添加预警信息
    @Override
    public boolean addEm(Map<String, Object> paramMap) throws SchedulerException, ClassNotFoundException {
        final String uuid = (String) paramMap.get("uuid");
        final long endTime = (long) paramMap.get("endTime");
        final Scheduler sc = SchedulerFactoryBean.getScheduler();
        String time = Dom4jUtil.get("aqi", "time");
        TaskUtil.addJob(sc, uuid, Class.forName("com.zc.www.task.EmergenceStartTask"), time);
        JobDetail jobDetail = sc.getJobDetail(new JobKey(uuid, "JOB_GROUP_SYSTEM"));

        if (jobDetail != null) {
            log.info("开启定时器成功");
            return true;
        }
        return false;
    }

最关键的地方就是在重写了SchedulerFactoryBean的jobFactory.

Spring bean注入为null

最近在学习SSM框架的过程中, 总是遇到一个问题, @Autowired注解自动装配bean总是失败, 所注解的变量值总是为null, 后来通过网上查资料,发现原因如下: 使用了new实例化对象,...
  • dou_yuan
  • dou_yuan
  • 2017-07-27 20:09:20
  • 1094

Spring如何为bean注入null值

前几个章节小博老师跟大家一起学习了基本类型注入、引用对象注入以及集合注入。今天我们一起来学习下如何为bean注入null值,也就是说设置空值。有的同学可能会说,设置空值还需要学习么,不设置这个属性就好...
  • bwf_erg
  • bwf_erg
  • 2017-04-10 22:30:17
  • 1184

spring中添加定时任务的bean

1、添加相关依赖的jar包,如果在maven项目中添加相关jar。 org.springframework spring ...
  • xiaozhaorui
  • xiaozhaorui
  • 2017-07-12 14:40:57
  • 254

动态注入Spring中的Bean实例快速指南

引言: 在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,都是静态方式的。在实际项目中,需要一种动态的方式来提取Spring管理的Bean,本文将介绍这样一种...
  • blueheart20
  • blueheart20
  • 2017-12-12 13:50:05
  • 275

spring给Bean属性注入null值

用于处理null值。Spring会把属性的空参数当作空字符串处理。以下的xml片断将email属性设为空字符串。 这等同于Java代码: exampleBean.setEmail("...
  • xiao_jun_0820
  • xiao_jun_0820
  • 2012-02-03 17:30:10
  • 9643

Spring 给Bean属性注入null值

空字符串值可以使用元素可用来表示。例如: 等同于Java代码: exampleBean.setEmail("")。null值则可以使用元素可用来表示。例如: ...
  • xiaojia1100
  • xiaojia1100
  • 2016-06-06 14:40:06
  • 960

Spring整合Quartz时,任务类中无法注入Bean的问题

项目中需要在tomcat启动时候就启动定时器运行定时任务,定时器采用在spring中集成quartz。 但是遇到了在任务类中需要引用注入类,但是注入类对象zhuangbeietongServic...
  • tuohuang0303
  • tuohuang0303
  • 2017-10-10 14:30:08
  • 786

在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean

1.有时候在项目中需要定时启动某个任务,对于这个需求,基于JavaEE规范,我们可以使用Listener与TimerTask来实现,代码如下:public class TestTaskListener...
  • Princeliu999
  • Princeliu999
  • 2017-02-20 20:39:32
  • 2243

java定时器无法自动注入的问题解析

最近公司在做对账单,要求定时自动执行,于是从网上查了各种定时器用法,最终没有一个是好用的,发现service层无法自动注入的原因导致,至于是什么原因导致无法注入,我还是不晓得,希望有这方面经验的同僚给...
  • q12345qazxc
  • q12345qazxc
  • 2016-05-27 14:41:09
  • 1627

SpringMVC中定时器继承Task后无法对service注入问题

edisTask是通过定时器来每分钟像数据库里推送的,于是就有了 public class RedisTask extends Task { public void execute(...
  • A417478912
  • A417478912
  • 2016-09-01 16:25:08
  • 2641
收藏助手
不良信息举报
您举报文章:spring动态定时器,bean注入为null的问题解决
举报原因:
原因补充:

(最多只允许输入30个字)