Quartz定時器中Service注入時空指標問題解決
阿新 • • 發佈:2019-01-05
上週在做一個任務排程時,用到了Quartz定時器,用的xml配置方式,隨後進行資料庫操作時,發現service注入不進去,報空指標錯誤,然後網上查了一些資料,找到了一個比較好的解決方法,詳情如下:
1. 問題:用quartz定時器中的QuartzJobBean進行業務處理時,service物件會報空指標異常
2. 原因:job是在quartz中例項化出來的,不受spring的管理,所以就導致service注入不進去了
3. 解決方法:
1) 在定時器的配置中加入jobDataAsMap,用來向JobDetail傳參,配置要注入的service物件
2) 配置具體操作的類
<bean id="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="data.shijue.scheduling.schedulingStuGraduate" /> <property name="durability" value="true" /> <property name="jobDataAsMap"><!-- 非常重要,用來向JobDetail傳參 --> <map> <entry key ="studentPersonService" value-ref="studentPersonService"/> <entry key="timeout" value="5" /> </map> </property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetail" /> <!-- 每年的8月15執行 --> <property name="cronExpression" value="1 0 0 15 8 ? *" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="complexJobDetail" /> </list> </property> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> <!-- 工作的bean,一定要配置 --> <bean id="schedulingStuGraduate" class="data.shijue.scheduling.schedulingStuGraduate" />
3) 在類中通過getJobDataMap()獲取注入成功的service
public class schedulingStuGraduate extends QuartzJobBean{ /** * 排程 * 每年8月15日0時0分01秒執行該方法 * */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { //通過getJobDataMap()來獲取具體的Service studentPersonService= (StudentPersonService) context.getJobDetail(). getJobDataMap().get("studentPersonService"); Map<String, Object> map = new HashMap<String, Object>(); map.put("xjydlb", "1B91DA03-F6FD-42ED-8B8E-D0E8F4BB7E20"); studentPersonService.updateGraduate(map); } catch (Exception e) { e.printStackTrace(); } } @Autowired private StudentPersonService studentPersonService; }