java实现Quartz定时功能
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49975443
最近在学习定时相关的技术。当前,几乎所有的互联网公司都会涉及定时相关的业务。比如网站首页的定时更新,内容的定时推送等等都会涉及。在找工作面试中,面试官也会问相关的问题。所以,在对定时学习和理解的基础上,简单地整理了一下学习笔记,下文主要以代码的方式展示。启动一个定时任务的流程大致为:创建Marven项目->在pom文件中引入依赖包->配置需要执行的任务和时间->启动定时器->解析配置文件->获取待处理的类和方法->启动定时任务->执行具体的任务->监听->到下一次时间到达时再次执行。详情见下方代码,希望本文对你有所帮助。
1、由于创建的是marven项目,所以需要引入包。对应的pom文件如下。
<span style="font-size:18px;"> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.1.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.qpid</groupId> <artifactId>qpid-client</artifactId> <version>0.28</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.1.5.RELEASE</version> </dependency></span>
2、要创建定时任务,需要配置待执行的类、类中的方法、方法的执行周期。这里指定待执行的定时任务名称为searchJob,方法名称为search,定时器执行时间为10秒/次。注:配置文件中可以加入多个定时任务,自行配置。
timer.properties文件信息如下: searchJob:search:0/10 * * * * ?
3、定时任务的入口类如下所示。首先,加载配置文件,获取待执行的定时任务和时间;其次,启动定时器,然后解析配置文件,获取加载的类的和方法;最后,启动定时任务,当时间到达指定执行时,会执行相应的方法。
try {
/*
* 加载定时任务
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file:d:/conf/time-quartz.xml");
/*
* 启动定时器
*/
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
/*
* 启动定时任务
*/
for (String task : tasks) {
String[] parm = task.split(":");
String beanName = parm[0];
String methodName = parm[1];
String cron = parm[2];
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("object", applicationContext.getBean(beanName));
jobDataMap.put("methodName", methodName);
JobDetail jobDetail = JobBuilder.newJob(JobAdapter.class).
withIdentity(beanName, methodName).usingJobData(jobDataMap).build();
Trigger trigger = TriggerBuilder.newTrigger().
withIdentity(beanName, methodName).withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(jobDetail, trigger);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
4、定时任务代理
import java.lang.reflect.Method;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 定时任务代理
*/
public class JobAdapter implements Job {
private Object object;
private String methodName;
public Object getObject() {
return this.object;
}
public void setObject(Object object) {
this.object = object;
}
public String getMethodName() {
return this.methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
try {
Method method = this.object.getClass().getMethod(this.methodName, new Class[0]);
method.invoke(this.object, new Object[0]);
} catch (Exception e) {
throw new JobExecutionException(e.getMessage(), e);
}
}
}
5、定时任务
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.timer.modules.SearchService;
@Component("searchJob")
public class SearchJob {
@Resource
private SearchService searchService;
public void search(){
searchService.getSearhData();
}
}
6、定时任务的实现类
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class SearchService extends BaseJobService{
public void getSearhData() {
System.err.println("开始写入数据:");
try {
String filePath = System.getProperty("user.dir")
+ "\\src\\main\\java\\com\\timer\\dto\\" + "searchDto.txt";
File f = new File(filePath);
if(f.exists() && f.length() > 10){
f.delete();
f = new File(filePath);
f.createNewFile();
}
FileWriter fileWritter = new FileWriter(f.getCanonicalPath(), true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
List<String> content = getContent("http://www.baidu.com");
bufferWritter.newLine();
bufferWritter.newLine();
for (String str : content) {
bufferWritter.write(new String(str.getBytes("gb2312"),"UTF-8"));
bufferWritter.newLine();
}
bufferWritter.flush();
bufferWritter.close();
System.err.println(content.toArray().toString());
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("写入数据完成");
}
private List<String> getContent(String path) {
List<String> result = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
try {
java.net.URL url = new java.net.URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
connection.connect();
InputStream inputStream = connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = in.readLine()) != null) {
result.add(line);
}
in.close();
} catch (Exception e) {
sb.append(e.toString());
System.err.println(e);
System.err.println("Usage: java HttpClient <URL> [<filename>]");
}
return result;
}
}
java实现Quartz定时功能的更多相关文章
- java 多线程——quartz 定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java中实现定时功能
网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...
- java 多线程——一个定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- quartz实现定时功能实例详解(servlet定时器配置方法)
Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法 Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:/ ...
- 基于spring的quartz定时框架,实现简单的定时任务功能
在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...
- spring和Quartz的定时功能
一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- Quartz定时调度在Web中的应用
1.在数据库中建一个job表和job日志表 job表
随机推荐
- 带你深入理解STL之Set和Map
在上一篇博客带你深入理解STL之RBTree中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来" ...
- 《高性能MySQL》读书笔记(上)
<High Performance MySQL>真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧.常见问题全都有所提及.数据库的各种概念技巧平时都有接触,像索引.分区.Shardi ...
- RocketMQ,JStorm与Tair使用笔记
关于RocketMQ 启动mq nohup sh mqnamesrv -n 10.150.0.94:9876 & nohup sh mqbroker -n 10.150.0.94:9876 ...
- Linux的sleep()和usleep()
1.sleep和usleep都是linux中的程序挂起函数.只是时间的单位不一样. 2. sleep的基本单位是s(秒),也可以用m(分).h(小时). 例: sleep 1 : 挂起1秒 sleep ...
- DBCP连接池TestOnBorrow的坑
生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用.分析如下: TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了, ...
- Hibernate配置文件current_session_context_class的意思
转自:http://shuaigg-babysky.iteye.com/blog/563423 此设置的作用如下: What does sessionFactory.getCurrentSession ...
- J2EE学习从菜鸟变大鸟之六 EJB(Enterprise JavaBean)企业级Java组件
EJB (EnterpriseJavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK).其称为Java 企业Bean,是 ...
- 四大组件之Activity小结
一大波面试就要靠近,赶紧总结总结一些基础问题 1.Activity的概念 是Android应用层开发的四大组件之一,主要负责和用户交互部分,有自己的生命周期,在其上可以布置按钮,文本框等各种控件,简单 ...
- TCP的流量控制与拥塞控制小结
概述 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认.其中TCP的流量控制与拥塞控制是 ...
- ROS_Kinetic_04 ROS基础内容(一)
ROS_Kinetic_04 ROS基础内容(一) 在开始基础内容之前,假定您已经完成了ROS kinetic版本的安装, 如果没有请参考ROS kinetic安装说明. 1. 环境变量 在使用ROS ...