您的位置:首页 > 编程语言 > Java开发

spring和quartz整合实现定时任务(配置文件配置方式

2015-02-10 11:06 831 查看
在开发的时候遇到一个问题,就是需要定时的去扫描数据库中表的数据,当时就考虑到了利用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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐