java实现任务调度,主要分为几个步骤:
1.创建一个服务
2.创建一个任务类,将服务作为一个任务去完成(实现job接口)
3.创建一个任务类实体
4.创建一个触发器,指定触发规则
5.创建一个调度,绑定任务和触发器
接下来我们先看看IRemindService接口的代码:
/**
* @Title: IRemindService.java
* @Package org.service
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com
* @date 2017-5-26 下午7:54:13
* @version V1.0
*/
package org.service;
/**
*
* 项目名称:spring_Schop07
* 类名称:IRemindService
* 类描述:
* 创建人:Mu Xiongxiong
* 创建时间:2017-5-26 下午7:54:13
* 修改人:Mu Xiongxiong
* 修改时间:2017-5-26 下午7:54:13
* 修改备注:
* @version
*
*/
public interface IRemindService {
void sendMsg();
void sendMsg(String userName);
}
它的实现类也很简单,简单看看就行,重点不在这里,这里只是拟定一个任务,主要的调度在后面:
/**
* @Title: RemindServiceImpl.java
* @Package org.service.impl
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com
* @date 2017-5-26 下午7:55:19
* @version V1.0
*/
package org.service.impl;
import org.service.IRemindService;
/**
*
* 项目名称:spring_Schop07
* 类名称:RemindServiceImpl
* 类描述:
* 创建人:Mu Xiongxiong
* 创建时间:2017-5-26 下午7:55:19
* 修改人:Mu Xiongxiong
* 修改时间:2017-5-26 下午7:55:19
* 修改备注:
* @version
*
*/
public class RemindServiceImpl implements IRemindService {
/**(非 Javadoc)
* <p>Title: sendMsg</p>
* <p>Description(描述): </p>
* @see org.service.IRemindService#sendMsg()
*/
@Override
public void sendMsg() {
System.out.println("像张三发送一条信息!");
}
@Override
public void sendMsg(String userName) {
System.out.println("像"+userName+"发送一条信息!");
}
}
要想实现任务调度,那么久得实现Job接口,具体代码如下:
/**
* @Title: RemindJob.java
* @Package org.service.impl
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com
* @date 2017-5-26 下午7:58:09
* @version V1.0
*/
package org.service.impl;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.service.IRemindService;
/**
*
* 项目名称:spring_Schop07
* 类名称:RemindJob
* 类描述:
* 创建人:Mu Xiongxiong
* 创建时间:2017-5-26 下午7:58:09
* 修改人:Mu Xiongxiong
* 修改时间:2017-5-26 下午7:58:09
* 修改备注:
* @version
*
*/
public class RemindJob implements Job {
/**(非 Javadoc)
* <p>Title: execute</p>
* <p>Description(描述): 任务调度</p>
* @param arg0
* @throws JobExecutionException
* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
IRemindService remindService = new RemindServiceImpl();
System.out.println("任务:"+context.getJobDetail().getName());
remindService.sendMsg(context.getJobDetail().getJobDataMap().getString("user"));
}
}
接下来看看spring里面是如何配置的:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!--
1.创建任务实体类
2.创建触发器
3.创建调度(注入数据)
-->
<!-- <bean id="detailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="org.service.impl.RemindJob"></property>
<property name="jobDataMap">
<map>
<entry key="user" value="王五"></entry>
</map>
</property>
</bean> -->
<bean id="remindService" class="org.service.impl.RemindServiceImpl"></bean>
<!-- 讲普通的javaBean定义为任务,而省略了任务类 -->
<bean id="detailJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="remindService"></property>
<property name="targetMethod" value="sendMsg"></property>
<property name="arguments">
<list>
<value>赵六</value>
</list>
</property>
</bean>
<!-- 简单触发器 -->
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="repeatCount" value="-1"></property>
<property name="repeatInterval" value="3000"></property>
<property name="startDelay" value="1000"></property>
<property name="jobDetail" ref="detailJob"></property>
</bean>
<!-- 复杂触发器 -->
<!-- <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="detailJob"></property>
<property name="cronExpression" value="0 39 22 26 * ?"></property>
</bean> -->
<bean id="sche" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="trigger"/>
</list>
</property>
</bean>
</beans>
代码都编写完毕,我们来测试一下:
package org.service.impl;
import java.text.ParseException;
import java.util.Date;
import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
*
* 项目名称:spring_Schop07
* 类名称:RemindServiceImplTest
* 类描述: 测试类
* 创建人:Mu Xiongxiong
* 创建时间:2017-5-26 下午8:04:00
* 修改人:Mu Xiongxiong
* 修改时间:2017-5-26 下午8:04:00
* 修改备注:
* @version
*
*/
public class RemindServiceImplTest {
@Test
public void testMethod() throws SchedulerException, InterruptedException, ParseException {
//创建任务实体
JobDetail jobDetail = new JobDetail("job1","group1",RemindJob.class);
//给任务传递数据
jobDetail.getJobDataMap().put("user","李四");
//创建简单触发器
SimpleTrigger trigger = new SimpleTrigger("trigger1",SimpleTrigger.REPEAT_INDEFINITELY,3000);
//复杂触发器
//每个月的26号 21:20:00
//CronTrigger trigger = new CronTrigger("tigger3","group2","0 30 21 26 * ?");
//开始时间(当前毫秒数+1秒,延迟一秒)
trigger.setStartTime(new Date(System.currentTimeMillis()+1000));
//创建调度器
SchedulerFactory sfc = new StdSchedulerFactory();
Scheduler sche = sfc.getScheduler();
//注册任务和触发器
sche.scheduleJob(jobDetail, trigger);
//启动任务工程
sche.start();
//延迟10000ms
Thread.sleep(100000);
//关闭
sche.shutdown();
}
/**
* @throws InterruptedException
*
* @Title: testSpring
* @Description: 该方法的主要作用通过spring实现quartz
* @param 设定文件
* @return 返回类型:void
* @throws
*/
@Test
public void testSpring() throws InterruptedException{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Thread.sleep(10000);
}
}