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); } }