ssh项目中使用quartz来创建自己的定时任务
来源:互联网 发布:网狐6603源码 网盘 编辑:程序博客网 时间:2024/06/06 05:41
在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)
- ssh项目中使用quartz来创建自己的定时任务
- 在SSH框架中,使用Spring设置定时器Quartz来开启定时任务
- 使用Quartz创建定时任务
- SSH中使用quartz定时任务,执行两次解决办法
- quartz定时任务的使用
- java项目中定时任务之Quartz的应用
- 工作总结---梳理下项目中 的 定时任务 quartz
- 在项目中集成定时任务--->Quartz
- Spring web项目使用Quartz定时任务
- quartz任务定时任务创建
- spring中使用quartz实现定时任务
- grails中使用quartz编写定时任务
- Spring中使用定时任务Quartz
- 定时任务 quartz使用
- quartz的定时任务使用的补充。
- ssh中如何实现定时任务(spring对quartz的支持)
- QuartZ--Spring中定时任务的实现
- 定时任务调度器Quartz的使用
- 2017world final 慢慢写
- 从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.4
- Win10下使用Python自带的IDLE默认打开.py文件
- 代理模式
- 分享四个非常方便的二维码生成链接
- ssh项目中使用quartz来创建自己的定时任务
- window10下编译hadoop报错:Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:
- 初识Android studio与简单项目实践
- 【数据结构笔记】7:非递归快速排序
- activiti 流程变量
- 大量数据入库处理经验总结
- git远程库与本地联系报错:fatal: Not a git repository (or any of the parent directories): .git
- wpxf
- JavaWeb 11 Listener