最近在做实时接口时遇到一个实时发短信的功能,要求在每天的9-17-之间定时的发送,对此我采用了Spring 的Quartz方式来实现,现在将其思路大致总结如下:
Quartz是基于Spring框架之上的更加强大的定时器,它不仅可以轻松的实现定时器的功能,还可实现非常繁复的时间触发执行的任务,以下列出该方式实现定时器的步骤,供以后参考。
1、 首先实现需要定时触发的任务逻辑类和相关方法
如:要实现一个定时发送短信的功能,需要处理的逻辑步骤有如下几步:
A:在这个时间段内要发送的短信条数,其短信的内容通常存储在相关的表中(内容包括:电话号码、短信内容、短信的优先级等),通过数据库操作将要发送的短信信息
取出来。存储到相关的对象中,通过WebService服务发送到相关目标地。
B:在短信发出成功后,对方将会返回发送的状态(成功或失败),将返回的状态更新到表中
至此短信发送的逻辑处理完成。
2、 声明一个调用该内容的处理类,进行短信的发送功能。主要代码如下:
A:声明一个私有的Spring模板属性,并提供其getter/setter方法
TransactionTemplate
B:取得Spring的事务管理器
PlatformTransactionManager transactionManager =
this.get TransactionTemplate().getTransactionManager();
C:创建事务
DefaultTransactionDefinition dtd = newDefaultTransactionDefinition();
D:设置事务的状态
Dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUARE);
E:获取事务的状态
TransactionStatus status = transactionManager.get transaction(dtd);
F:调用发送短信的逻辑处理类
G:提交事务
H:在catch块进行事务的回滚处理
3、 配置一个调用的xml文件
Xml文件的格式为Spring框架的jobs.xml配置内容如下:
<beans>
<jee:jndi-lookup id=”dataSource” jndi-name=”java:comp/env/jdbc/als”></jee:jndi-lookup>
<bean id=” transactionManager”class=” org.Springframework.jdbc.dataSource.DataSourceTransactionManager”>
<prototype name=”dataSource” ref=”dataSource”/>
</bean>
<bean id=” transactionTemplate”class=” org.Springframework.transaction.support.TransactionTemplate>
<prototype name=” transactionManager”ref=” transactionManager”/>
</bean>
<bean id =”sendMessageInfo”scope=”prototype” class=”此处为第一步所编写的触发任务的处理类的全路径”>
<prototype name=” transactionTemplate” ref=” transactionTemplate”/>
</bean>
<bean id =”sendMessageJob”class=”org.Springframework.scheduling. Quartz.MethodInvokingJobDetailFactoryBean”>
<property name=”targetObject” ref=” sendMessageInfo”></property>
<property name=”targetMethod” value=” run”></property>
此处value的值run 表示触发业务处理类中的方法名
</bean>
<bean id =”sendMessageJobTrigger”class=”org.Springframework.scheduling. Quartz.CronTriggerBean”>
<property name=”jobDetail” ref=” sendMessageJob”></property>
<property name=”cronExpression” >
<value>0 0/1 9-21 **></value> <!—设置该任务要触发的时间段-->
</property>
</bean>
<bean id =”schedulerFactory”class=”org.Springframework.scheduling. Quartz.SchedulerFactoryBean”>
<property name=”triggers”>
<list>
<ref bean = “sendMessageJobTrigger”/>
</list>
</property>
</beans>
4、 在WEB.xml文件中配置第三步配置好的xml文件,当系统初始化时就调用,内容如下:
<listener>
<listener-class>org.springframework.web.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLoaction<param-name>
<param-name>/WEB-INF/jobs.xml<param-name>
</context-param>