Spring定时器_配置文件模式
Spring定时器_配置文件方式
最近项目中需要定时推送通知到Apple设备中,于是学习了一下Spring定时器的应用,这里分享一下:
Spring定时器是基于quartz实现,我采用的是quartz-all-1.6.0.jar
启用定时器可以在xml配置文件中设置,也可以在代码中定义:
(1)配置文件方式
在Spring的配置文件中分别定义定时任务类,触发器,调度器
下面是定义触发器,触发器有两种:SimpleTriggerBean和CronTriggerBean,我这里需要指定在整点时刻执行任务,所以采用CronTriggerBean:
关于cronExpression的设置,下面给出示例:
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
***********************************************************
下面在配置调度类:
配置完毕,这样程序启动后,到达整点时刻,即执行com.**.PushNotificationTask
的executeInternal方法:
下面是PushNotificationTask的定义:
最近项目中需要定时推送通知到Apple设备中,于是学习了一下Spring定时器的应用,这里分享一下:
Spring定时器是基于quartz实现,我采用的是quartz-all-1.6.0.jar
启用定时器可以在xml配置文件中设置,也可以在代码中定义:
(1)配置文件方式
在Spring的配置文件中分别定义定时任务类,触发器,调度器
<bean name="pushNotificationJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <!--这里是指定定时任务具体执行的内容--> <value>com.**.PushNotificationTask </value> </property> <property name="jobDataAsMap"> <map> <entry key="timeout"> <!-- 容器启动20秒钟后调用 --> <value>20</value> </entry> <!-- 这里是设置给jobClass的各种属性 --> <!--证书名称 如:**.p12,请将证书放在web-inf/classes/config/目录下 --> <entry key="certName"><value>aps_development.p12</value></entry> <!--证书密码 --> <entry key="password"><value>spring</value></entry> <entry key="isProduction"> <!-- 设置1为正式服务地址,0为开发者地址 --> <value>0</value> </entry> <!--apple设备服务 用于获取所有待推送的设备及更新设备信息 --> <entry key="appleDeviceService" value-ref="appleDeviceService" /> <!--推送通知服务 用于获取待推送的消息 及推送成功后更新消息状态 --> <entry key="pushNotificationService" value-ref="pushNotificationService" /> <!--appleDeviceService及pushNotificationService是其他定义的bean--> </map> </property> </bean>
下面是定义触发器,触发器有两种:SimpleTriggerBean和CronTriggerBean,我这里需要指定在整点时刻执行任务,所以采用CronTriggerBean:
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="pushNotificationJob" /> </property> <property name="cronExpression"> <!-- 参数指定每隔1小时运行 --> <value>0 0 * * * ?</value> </property> </bean>
关于cronExpression的设置,下面给出示例:
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
***********************************************************
下面在配置调度类:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="cronTrigger" /> </list> </property> </bean>
配置完毕,这样程序启动后,到达整点时刻,即执行com.**.PushNotificationTask
的executeInternal方法:
下面是PushNotificationTask的定义:
import javapns.notification.transmission.NotificationProgressListener; import javapns.notification.transmission.NotificationThread; import javapns.notification.transmission.NotificationThreads; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class PushNotificationTask extends QuartzJobBean { IBaseService appleDeviceService;// 设备service IBaseService pushNotificationService;// 推送通知Service /** * 定时推送 */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { JobDataMap dataMap = context.getJobDetail().getJobDataMap(); // 这里可以获取配置<entry key>中的各项参数 appleDeviceService = (IBaseService) dataMap.get("appleDeviceService"); pushNotificationService = (IBaseService) dataMap .get("pushNotificationService"); //任务具体要干什么事,就写在这里了……………… } }