本文是在学习中的总结,欢迎转载但请注明出处: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定时功能的更多相关文章

  1. java 多线程——quartz 定时调度的例子

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. java中实现定时功能

    网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...

  3. java 多线程——一个定时调度的例子

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. quartz实现定时功能实例详解(servlet定时器配置方法)

    Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法 Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:/ ...

  5. 基于spring的quartz定时框架,实现简单的定时任务功能

    在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...

  6. spring和Quartz的定时功能

    一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...

  7. spring利用javamail,quartz定时发送邮件 <转>

    原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...

  8. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  9. Quartz定时调度在Web中的应用

    1.在数据库中建一个job表和job日志表 job表

随机推荐

  1. webstorm工具使用详解

    webstorm简单介绍 官网地址:http://www.jetbrains.com/webstorm/features/index.html 参考地址:http://www.html5jscss.c ...

  2. Android布局中ScrollView与ListView的冲突的最简单方法

    看到网上流行的一种使用方法是: public class Utility { public static void setListViewHeightBasedOnChildren(ListView ...

  3. H5、React Native、Native应用对比分析

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博!iOS开发者交流QQ群: 446310206 "存在即合理".凡是存在的,都是合乎规律的.任何新 ...

  4. 18 UI美化状态集合的位图selector

    当我们某个控件 想在不同状态下显示不同的背景图的需求 如我们需要按钮在正常状态显示一种图 按下显示另一背景图 或者单选框被选中时是一种显示图片 没选中是另一种背景图 例子 按钮在不同状态显示不同的背景 ...

  5. 4.4、Android Studio在命令行运行Gradle

    默认情况下,在你的Gradle构建设置中有两种构建类型:一种是为了调试你的应用,debug类型:一种是构建最终的发布版本,release类型.无论你使用哪种模式,你的app必须在安装到设备或虚拟机中之 ...

  6. Cocos2D实现RPG游戏人物地图行走的跟随效果

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在一些RPG游戏中,人物队列在地图中行走的时候有时需要实现一个 ...

  7. 人类创造未来的思想先锋:这些 TED 演示深深震撼着我们

    今年亮点之一是谷歌创始人拉里佩奇的演讲.他有一个核心观点:特别成功的公司,是那些敢于想象未来,并付出行动创造未来的公司.这听上去是老生常谈,但又确实是个真理.他实际上想说预测未来的最好方式就是创造它, ...

  8. Android开发学习之路--Camera之初体验

    顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就可以通过camera来拍照,然后存储照片,发送给好友.那么微信的app里面是不会直接通过camera api来实现的,因为 ...

  9. Android初级教程以动画的形式弹出窗体

    这一篇集合动画知识和弹出窗体知识,综合起来以动画的形式弹出窗体. 动画的知识前几篇已经做过详细的介绍,可翻阅前面写的有关动画博文.先简单介绍一下弹出窗体效果的方法: 首先,需要窗体的实例:PopupW ...

  10. Google Guava的5个鲜为人知的特性

    译文出处: 花名有孚   原文出处:takipi.com Google Guava有哪些比较冷门但却又实用的特性呢? 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比 ...