項目中在Spring中集成了Quartz,配置的每日凌晨執行的定時任務都是到了八點多才執行,經過一番查找,可能是時區問題造成的。
- 一種解決辦法是在JVM啟動參數中增加 --Duser.timezone=GMT+08
- 另一種辦法是在配置文件中增加timeZone的配置
改JVM參數的方式,一但項目遷移實施人員可能會忘記改,所以決定再代碼里做手腳。
1、獲取一個TimeZone,使用java.util.TimeZone.getTimeZone(String ID)獲取指定的TimeZone,ID有兩種形式,一種為完整名稱例如“
America/Los_Angeles”、“Asia/Shanghai”,或者一個自定義ID比如“GMT-8:00”
Spring配置如下
<bean id="timeZone" class="java.util.TimeZone" factory-method="getTimeZone"> <constructor-arg> <value>GMT+8:00</value> </constructor-arg> </bean>
2、給TriggerBean注入
<bean id="testJob" class="org.eu.raybit..jobs.TestJob" /> <bean id="testJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="testJob" /> </property> <property name="targetMethod"> <value>execute</value> </property> </bean>
<bean id="testJobTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="testJobMethod"></property> <property name="cronExpression" value="0 0 0 1/1 * ? "></property> <property name="timeZone" ref="timeZone"/> </bean>