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表
随机推荐
- Android 读取清单文件<meta-data>元素的数据
添加属性 <application -- > <meta-data android:value="Channel_0" android:name="UM ...
- hive元数据库表分析及操作
在安装Hive时,需要在hive-site.xml文件中配置元数据相关信息.与传统关系型数据库不同的是,hive表中的数据都是保存的HDFS上,也就是说hive中的数据库.表.分区等都可以在HDFS找 ...
- 安卓高仿QQ头像截取升级版
观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图: 为了适应大家不同需求,这次打了两个包,及上图 ...
- [ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39252805 官方例子:http://docs.sencha.com/extjs/5. ...
- 从嵌入式linux到android应用开发
时间过得很快,转眼之间已经到新公司一个月了.虽然学到了一些移动开发的知识,但是觉得离我的目标还很远,完全没能达到我想要的水平.以前产品都是自己主导的,需要完成什么,计划什么也是自己主导,现在得从头 ...
- [java面试]逻辑推理6 10 18 32 下一个数?编程实现输入任意一个N位置,该数是多少?java实现
题目: 6 10 18 32 下一个数?编程实现输入任意一个N位置,该数是多少? 10 = 6 + 4 4 18 = 10 + 8 4 + 4 32 = 18 + 14 ...
- 消息字节——MessageBytes
在tomcat核心处理中有这么一个需求--"为了提高编码性能,对于socket接收到的字节流不马上进行某种编码的转码,而是应该保留字节流的形式,在需要时.在指定编码时才进行转码工作" ...
- 学习笔记3-开发与运行(卸载)第一个ANDROID应用
新建Android项目 1. 配置好Android坏境以后,新建项目选择Android Project. 2. 选择针对哪个平台开发的应用(Android2/Android4等) ...
- ROS_Kinetic_21 使用Qt Creator Plug in即ros_qtc_plugin
更为详细版本请参考: http://blog.csdn.net/zhangrelay/article/details/52214411 结合看更为具体. 首先,先上原版参考: 1 http://wik ...
- iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 简单介绍: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 ...