Spring使用Quartz定時排程Job無法Autowired注入Service的解決方案
專案過程中有這樣一個場景:呼叫微信開放平臺介面獲取access_token,每2小時access_token失效一次,每天限額2000次,因此在專案中做了如下處理:
1)啟動服務時,呼叫外部介面獲取access_token入庫;
2)每隔1小時呼叫一次外部介面,獲取最新的access_token入庫;
針對上述第1)點,直接使用mvc的方式,在service層呼叫外部介面即可,這裡需要使用到幾個引數:grant_type,appid,secret,這些引數在配置檔案中通過@Vaue的方式注入進來,在Controller呼叫Service時可以使用,那麼問題來了:
第2)點,在定時呼叫時,也希望通過注入的Service直接使用呼叫方法,寫法如下:
@Component
public class AccessTokenJob extends QuartzJobBean{
@Autowired
private AccessTokenService accessTokenService;
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException
{
this.accessTokenService.processAccessToken();
}
}
這裡的accessTokenService竟然無法注入,直接導致使用時產生空指標異常!
上網找了一些方法,大都不管用,最終解決辦法如下:
1)自定義JobFactory,通過spring的AutowireCapableBeanFactory進行注入,例如:
public class MyJobFactory extends org.springframework.scheduling.quartz.SpringBeanJobFactory
{
@Autowired
private AutowireCapableBeanFactory beanFactory;
/**
* 這裡覆蓋了super的createJobInstance方法,對其建立出來的類再進行autowire。
*/
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
beanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
2)定義上述類之後,需要在定義觸發器,引用org.springframework.scheduling.quartz.SpringBeanJobFactory的地方,配置property,例如(見紅色部分):
<bean name="quartzScheduler" lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="ds" />
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="classpath:quartz.properties" />
<property name="triggers">
<list>
<ref bean="trigger" />
</list>
</property>
<property name="jobFactory">
<bean class="com.xxx.MyJobFactory" />
</property>
</bean>
如此,大功告成!
相關文章
- 定時排程系列之Quartz.Net詳解quartz
- Spring中Quartz排程器的使用Springquartz
- DBMS_JOB.SUBMIT 建立job定時排程MIT
- SpringBoot中普通類無法通過@Autowired自動注入Service、dao等bean解決方法Spring BootBean
- Spring Boot無法對Service進行注入Spring Boot
- VMware USB Arbitration Service 無法啟動的解決方案
- NET作業排程(定時任務)-Quartz.Netquartz
- 解決Autowired注入失敗為nullNull
- Spring排程定時任務的方式Spring
- Spring @Autowired 注入小技巧Spring
- Spring4+Springmvc+quartz實現多執行緒動態定時排程SpringMVCquartz執行緒
- Quartz排程系統入門和排程高可用實現方案quartz
- 踩坑篇之WebSocket實現類中無法使用@Autowired注入物件Web物件
- Oracle無法自動排程DBMS_JOB&DBMS_SCHEDULER案例分析Oracle
- Spring Boot 注入介面 @Autowired interfaceSpring Boot
- 分散式定時器 Quartz 作業中注入 Spring 依賴項分散式定時器quartzSpring
- Spring Quartz定時器&n…Springquartz定時器
- [原始碼分析] 定時任務排程框架 Quartz 之 故障切換原始碼框架quartz
- 關於Quartz的Job 不能被注入以及SpringAop對Job失效quartzSpring
- 深入解讀Quartz任務排程器quartz
- Net作業排程(五)—quartz.net動態新增job設計quartz
- 十七、.net core(.NET 6)搭建基於Quartz元件的定時排程任務quartz元件
- Spring5:@Autowired註解、@Resource註解和@Service註解Spring
- Quartz.net開源作業排程框架使用詳解quartz框架
- 排程器Quartz的簡述與使用總結quartz
- [Windows無法連線到 System Event Notification Service服務]解決方案Windows
- Spring Scheduler定時任務 + QuartzSpringquartz
- Java定時任務排程詳解Java
- 在Spring中使用JDK定時器實現排程任務SpringJDK定時器
- Grails整合Quartz外掛實現定時任務(Job)AIquartz
- Quartz - Spring整合Quartz實現叢集的定時任務quartzSpring
- 使用Spring整合Quartz輕鬆完成定時任務Springquartz
- Quartz定時任務框架(二) Quartz詳解quartz框架
- docker ubuntu 的vi,nano命令無法使用的解決方案DockerUbuntuNaN
- 【故障排查】10分鐘解決Quartz重複排程的疑難雜症quartz
- Spring Boot 配置 Quartz 定時任務Spring Bootquartz
- 使用Java實現定時任務排程Java
- spring 迴圈注入:is there an unresolvable circular reference的解決方案Spring