在开发的时候遇到一个问题,就是需要定时的去扫描数据库中表的数据,当时就考虑到了利用quartz去实现。
实现的是定时的去发送邮件的任务,设计的时候有三张表,一张是需要扫描的表email,一张是发送成功的表emailSuccess,还有一张表是发送失败的表emailFail,失败表中还记录的了发送失败的原因。扫描表的时候如果发送成功则将记录插入到成功表,并删除扫描中的记录,失败也是同样的道理。
maven工程中首先导入以下依赖:
<span style="white-space:pre"> </span><dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
代码如下:
public class JobMailMessageService{
private static final Logger logger = LoggerFactory.getLogger(JobMailMessageService.class);
@Autowired
IMcMessageService mcMessageService;
@Autowired
IMcBasEmailService basMcEmailService;
@Autowired
IMcBasEmailFailService basMcEmailFailService;
@Autowired
IMcBasEmailSuccessService basMcEmailSuccessService;
public void sendMcEmailJob() {
List<McBasEmail> list = basMcEmailService.findBySendTimeStatus(new Date());//查询数据,相当于扫描表
if(list != null && list.size() > 0){
logger.info("Send Email task execution start time:" + new MyDate() + " Information number:" + list.size());
try{
Iterator<McBasEmail> iter = list.iterator();
McBasEmail bMessage = new McBasEmail();
while (iter.hasNext()){
bMessage = iter.next();//待发送邮件
int returnFlag = mcMessageService.sendEmail(bMessage.getReceiver(), bMessage.getSubject(), bMessage.getContent());
if(returnFlag == 1){
McBasEmailSuccess bSuccess = new McBasEmailSuccess(bMessage.getReceiver(), bMessage.getSubject(), bMessage.getContent(), bMessage.getKey(),
2L, bMessage.getGrpId(), bMessage.getTaskType(), bMessage.getSendTime(), bMessage.getCreateTime(), null);
basMcEmailSuccessService.create(bSuccess);
basMcEmailService.delete(bMessage);
} else {
McBasEmailFail bFail = new McBasEmailFail(bMessage.getReceiver(), bMessage.getSubject(), bMessage.getContent(), bMessage.getKey(),
3L, bMessage.getGrpId(), bMessage.getTaskType(), "", bMessage.getSendTime(), new Date(), null);
basMcEmailFailService.create(bFail);
basMcEmailService.delete(bMessage);
}
}
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage(), e);
}
logger.info("Send Email to perform a task over:" + new MyDate());
}
}
}
配置文件
quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 邮件查询job -->
<bean id="emailJob" class="com.quartz.JobMailMessageService"></bean>
<!-- 邮件 定义调用对象和调用对象的方法 -->
<bean id="emailJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="emailJob" /><!-- 调用的Job类 -->
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>sendMcEmailJob</value><!-- 调用的类中的方法 -->
</property>
</bean>
<!-- 邮件 定义触发时间 -->
<bean id="emailJobTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="emailJobTask" />
</property>
<!-- cron表达式 时间调用间隔,为秒 -->
<property name="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<!-- 如果lazy-init='true',则需要实例化该bean才能执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="emailJobTime" />
</list>
</property>
</bean>
</beans>