quartz的job类无法保留本身通过spring注入的属性问题

本文探讨了在使用Spring和Quartz进行定时任务时遇到的注入问题,详细介绍了如何正确配置Spring以解决Quartz Job中依赖注入失效的情况,并提供了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

    现在有一个应用需要定时做一些动作,使用的是quartz+spring,但是没有使用spring实现的quartz,这里发现了一个问题,就是通过spring注入进来的bean用于做为quartz的job时,无法保留该job已经通过spring注入好的属性,quartz会根据注入类完全new一个类,如下,我的job类:        

public class SendMsgJob implements Job {    private SenderThread senderThread;    @Override    public void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException {        System.out.println(senderThread);    }    public void setSenderThread(SenderThread senderThread) {        this.senderThread = senderThread;    }    public SenderThread getSenderThread() {        return senderThread;    }}

    任务实现类中需要一个发送消息的线程,在这里需要被注入,在spring中有该bean的配置,我在Trigger中还可以获取得到该属性senderThread,实现代码如下:

public class SendTrigger {    Logger       log = LoggerFactory.getLogger(SendMsgJob.class);    List<Object> jobList;    public void init() throws Exception {        SchedulerFactory sf = new StdSchedulerFactory();        Scheduler sched = sf.getScheduler();        if (jobList == null) {            return;        }        String group = "group1";        for (int i = 0; i < jobList.size(); i++) {   //这里能够打出获取到属性值,说明注入成功   System.out.println(((Job) jobList.get(i)).getSenderThread())   //可是这里注册为job时候,传入的是class,quartaz在启动的时候是重新new了一个对象,因而原来已有属性值全部没了            JobDetail job = newJob(((Job) jobList.get(i)).getClass()).withIdentity("job" + i, group).build();            CronTrigger trigger = newTrigger().withIdentity("trigger" + i, group).withSchedule(cronSchedule("0 0/1 * * * ?")).build();            sched.scheduleJob(job, trigger);        }        // 启动定时任务        sched.start();    }    public void setJobList(List<Object> jobList) {        this.jobList = jobList;    }}
    spring中的配置如下:

 <!--定时器任务配置(开始)--> <bean id="trigger" class="automan.timer.job.SendTrigger" init-method="init">  <property name="jobList">   <list>    <ref local="sendMsgJob"></ref>   </list>  </property> </bean> <!-- 定时发送的任务 --> <bean id="sendMsgJob" class="automan.timer.job.SendMsgJob">  <property name="senderThread">   <ref local="senderThread"></ref>  </property> </bean> <!--定时器任务配置(结束)-->
    查看了它创建一个新的任务的源码,暂时还没有找到解决方案,网上搜索都是使用的spring封装好的quartz,也没有找到有人提相同的问题,是我实现上的问题,还是什么原因?再找找原因,既然spring能够实现,那我相信肯定有办法解决的。

    后记:

    后面还是选择了spring对quartz的封装使用,使用的方式如下:    

 <!--定时器任务配置(开始)-->   <!--配置JOB--> <bean id="scheduledSendMsgJob"  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  <property name="targetObject" ref="sendMsgJob" />  <property name="targetMethod" value="execute" /> </bean> <!--配置Trigger--> <bean id="sendMsgJobTrigger"       class="org.springframework.scheduling.quartz.SimpleTriggerBean">       <property name="jobDetail" ref="scheduledSendMsgJob" />       <property name="startDelay" value="10000" />     <!-- 每1分钟执行一次 -->     <property name="repeatInterval" value="60000" /> </bean> <!--配置Scheduler--> <bean id="schedulerFactory"       class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">       <property name="triggers">           <list>               <ref bean="sendMsgJobTrigger" />           </list>       </property>       <property name="autoStartup" value="true"/> </bean> <bean id="sendMsgJob" class="automan.timer.job.SendMsgJob">  <property name="senderThread">   <ref local="SenderThread"></ref>  </property> </bean> <!--定时器任务配置(结束)-->

不过需要注意一点的是,spring与quartz的版本配合:

spring 2.5.5 配 quartz 1.7.x

spring 2.5.6 配 quartz 1.8.x

sprint 3.x 配 quartz 2.x

本文出自:冯立彬的博客





           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值