ssh项目中使用quartz来创建自己的定时任务

时间:2021-07-05 07:49:29

在javaweb项目中相信大家都遇到过这种问题:就是要在一定的时间或者是一定的频率去做某一件事:方法有很多中,这里给大家介绍的是quartz组件。本人一天时间就学会如何使用在ssh项目中。比较好用,所以推荐大家使用。

1、下载jar包

地址:http://www.quartz-scheduler.org/downloads/

目录ssh项目中使用quartz来创建自己的定时任务

2、创建web项目导入ssh的jar包和quartz所需要的jar包,必须要用到的包。ssh包可以找我找因为太多,不方便贴出来

ssh项目中使用quartz来创建自己的定时任务

3、以及创建一个属性配置文件src下面,或者为当前类路径下

ssh项目中使用quartz来创建自己的定时任务

代码

# 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)