在javaweb项目中相信大家都遇到过这种问题:就是要在一定的时间或者是一定的频率去做某一件事:方法有很多中,这里给大家介绍的是quartz组件。本人一天时间就学会如何使用在ssh项目中。比较好用,所以推荐大家使用。
1、下载jar包
地址:http://www.quartz-scheduler.org/downloads/
目录
2、创建web项目导入ssh的jar包和quartz所需要的jar包,必须要用到的包。ssh包可以找我找因为太多,不方便贴出来
3、以及创建一个属性配置文件src下面,或者为当前类路径下
代码
# Default Properties file for use by StdSchedulerFactory
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
4、我是创建了一个任务调度类(一个工具类)
代码:里面有详细的注释
官方的使用
package test;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
//通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory=new StdSchedulerFactory();
Scheduler scheduler=null;
try{
// 通过schedulerFactory获取一个调度器
scheduler=schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();
// 定义调度触发规则
// 使用simpleTrigger规则
// Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")
// .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))
// .startNow().build();
// 使用cornTrigger规则 每天10点42分
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("50 19 9 * * ? *"))
.startNow().build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
自己定义的工具类:QuartzUtil
package com.itzhongc.util;
import java.util.Properties;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
* 任务调度服务类
* @author FENG
*/
public class QuartzUtil {
public static Scheduler scheduler=null;
/**
* @param jobName,随意指定,多个调度器名称最好不要重复 否则会报一个名称已经存在的错误
* @param jobGroup随意指定
* @param triggerName随意指定
* @param triggerGroup随意指定
* @param expression 时间表达式
* @throws SchedulerException
*/
public static void add(String jobName,String jobGroup,String triggerName,String triggerGroup,String expression) throws SchedulerException{
if(scheduler==null){
StdSchedulerFactory sf = new StdSchedulerFactory();
Properties props = new Properties();
props.put("org.quartz.scheduler.instanceName", jobName);
props.put("org.quartz.threadPool.threadCount", "10");//#必填
sf.initialize(props);
scheduler = sf.getScheduler();
}
JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity(jobName, jobGroup).build();
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup)
.withSchedule(CronScheduleBuilder.cronSchedule(expression))
.startNow().build();
scheduler.scheduleJob(job, trigger);//添加到任务中
scheduler.start();
}
}
在上面这段代码中有一个MuJob的一个类,该类只需要继承Job类
package test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
/**
* 任务类
* @author FENG
*/
public class MyJob implements Job{
//要执行的任务写里面
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
System.out.println("SchedulerName:"+context.getScheduler().getSchedulerName());
} catch (SchedulerException e) {
e.printStackTrace();
}
System.out.println("任务1");
}
}
而我在项目中是这样写的:因为需要service类执行一些其他的操作,所以该类还实现了Filter来获取service
package com.itzhongc.util;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;
import com.itzhongc.share.user.entity.Content;
import com.itzhongc.share.user.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
/**
* 任务类
* @author FENG
*/
public class MyJob extends ActionSupport implements Job,Filter{
private static final long serialVersionUID = 1L;
private static UserService userService;
//要执行的任务写里面
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
List<Content> contentlist = userService.sendTimeContent();//获取没有发布的内容
if(contentlist!=null){
for (Content content : contentlist) {
//2017-05-24 14:10:10.0
long time1 = new Date().getTime();//当前时间
long time2 = content.getUser_send_time().getTime();//数据库中要发布的时间
if(Math.abs(time1-time2)<6000){//可以发布消息
content.setSend(true);//修改他的发布情况为可以发布
userService.updateContent(content,content.getId());//修改状态
}else{
/**
* 删除没有用的消息
*/
userService.delMessage(content.getUser_id().getId(), content.getId());//消息过期,删除任务列表
}
}
}
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
ServletContext sc = config.getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
userService = (UserService) cxt.getBean("userService");//获取service操作对象
}
}
在action中只需要调用工具类中的add方法即可将任务添加到调度器中
QuartzUtil.add(UUID.randomUUID().toString(),
UUID.randomUUID().toString(),
UUID.randomUUID().toString(),
UUID.randomUUID().toString(),
getExpression(parameter));//获取时间表达式
这里有一个获取时间表达式,传入的为要设置执行的时间
/**
* 获取时间表达式
* @param s
* @return
*/
public String getExpression(String s){
StringBuffer sb = new StringBuffer();
String[] split = s.split(" ");//切割
String[] split1 = split[0].split("-");//日期
String[] split2 = split[1].split(":");//时间
sb.append(split2[2]);//秒
sb.append(" ");
sb.append(split2[1]);//分
sb.append(" ");
sb.append(split2[0]);//时
sb.append(" ");
sb.append(split1[2]);
sb.append(" ");
sb.append(split1[1]);
sb.append(" ");
sb.append("?");
sb.append(" ");
sb.append(split1[0]);
return sb.toString();
}
具体的实现思路:通过MyJob类实现Filter来获取service,通过用户的请求来调用工具类中的方法,设置时间戳来触发调度器的执行。调度器会默认执行MyJob类中的execute方法。所以你只需要将你要实现的功能写在其中即可。
总结实现过程
1、导入jar包
2、创建属性配置文件(默认复制进去不需要改)
3、创建工具类,来设定调用的方法。
4、创建一个类实现Job类,在execute方法中写你需要实现的代码。
5、在action中调用工具类中的add方法来设置执行任务的时间。
完毕
如果想深入的了解,不妨我们交个朋友一起讨论学习:984961800(qq)