使用quratz定时调用

最近在工作上需要定时调用的功能,定时调用在web中应用还是蛮多的,比如说课表提醒,每天晚上提醒一遍有什么课要上啦,或者就像目前我需要完成的功能,定时的一个数据库的数据导入到另一个数据库中。

而quratz是一个完全由java编写的开源作业调度框架。尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!使用起来确实特别方便,也很实用。

废话不多说,直接上!

首先需要quratz相关jar包,我使用的是quartz-2.2.1.jar。

接下来就需要一个job执行类和一个任务调度类。

任务调度类,在该类中制定corn表达式,通过该表达式来按你的要求来实现定时方式,比如每天某个时间运行。

package com.gisquest.djgx.modules.services;

import java.util.Properties;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.gisquest.djgx.modules.sys.entity.WsDefine;
import com.gisquest.djgx.modules.sys.utils.DictUtils;

@Component
@Transactional(readOnly = true)
public class InvokeService {

    SchedulerFactory sf = null;
    Scheduler sched = null;

	// 点击启动按钮调用的方法
	public void scheduler(WsDefine wsDefine,String basePath,String id) {
		String deftime = wsDefine.getDeftime();
		String month = "*";
		String year = "?";

		String schedName = "schedu"+id;
		String jobName = "job"+id;
		String groupName = "group"+id;
		String triggerName = "trigger"+id;
		String schedString="";
		try {
			Properties props = new Properties();
			props.put("org.quartz.scheduler.instanceName", schedName);
			props.put("org.quartz.threadPool.threadCount", "100");
			sf = new StdSchedulerFactory(props);
			if(sf.getScheduler(schedName) != null){
				sched = sf.getScheduler(schedName);  // 初始化调度器
			}else{
				sched = sf.getScheduler();  // 初始化调度器
			}
			JobDetail job = JobBuilder.newJob(QuartzJob.class)
					.withIdentity(jobName, groupName).build(); // 设置作业,具体操作在QuartzJob类里
			job.getJobDataMap().put("wsurl", basePath+wsDefine.getUrl());//添加调用功能需要的熟悉
			job.getJobDataMap().put("jobid", wsDefine.getJobid());
			job.getJobDataMap().put("wsname", wsDefine.getName());
String[] str = deftime.split(":");
			 schedString = str[2] + " " + str[1] + " " +str[0]+ " " + "*"
					+ " " + month + " " + year;

			System.out.println(schedString);
			System.out.println(sched);
			CronTrigger trigger = (CronTrigger) TriggerBuilder
					.newTrigger()
					.withIdentity(triggerName, groupName)
					.withSchedule(CronScheduleBuilder.cronSchedule(schedString))
					.build(); // 设置触发器
			sched.scheduleJob(job, trigger); // 设置调度作业
			sched.start(); // 开启调度任务,执行作业
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	// 点击停止按钮调用的方法
	public void stopService(String id) {
		String schedName = "schedu"+id;
		try {
			if (sf.getScheduler(schedName) != null) {
				sf.getScheduler(schedName).shutdown();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

这上面只使用了CronTrigger的方式,还有一种更简单点的方式SimpleTrigger,该方式没有cronTrigger方式更精确。在本文下面有CronTrigger表达式的配置格式。

job执行类,该类需要实现quratz的job接口,并实现execute方法,你要定时调用的功能就在该execute方法中调用。

<span style="font-size:18px;">package com.gisquest.djgx.modules.services;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@Transactional(readOnly = true)
public class QuartzJob implements Job {
	private static final Logger log = LoggerFactory.getLogger(QuartzJob.class);

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		try {
			JobDataMap dataMap = context.getJobDetail().getJobDataMap();
			String wsurl = dataMap.getString("wsurl");
			String jobid = String.valueOf(dataMap.getInt("jobid"));//从之前在任务调度中传入的属性
			String wsname = dataMap.getString("wsname");
			System.out.println(wsurl+jobid+wsname);
			WsService wsService = new WsService();
			System.out.println(wsService);
			wsService.callWebService(null,wsurl,"pushData",jobid,wsname);//定时调用的方法
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getLocalizedMessage());
		}
	}

}</span>

CronTrigger配置格式:

格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符
1 0-59 , - * /
2 0-59 , - * /
3 小时 0-23 , - * /
4 1-31 , - * ? / L W
5 1-12 or JAN-DEC , - * /
6 1-7 or SUN-SAT , - * ? / L #
7 empty 或 1970-2099 , - * /

常用示例:

0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 15 10 * * ? 每天10点15分触发
0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2005 2005年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 03:45:50

使用quratz定时调用的相关文章

ASP.NET定时调用WebService 运行后台代码

效果: 通过在网站的Global.asax的Application_Start方法中 加入定时器 定时调用WebService 该WebService的一个方法 负责在后台 向数据库的某个表加入数据 步骤: 1.通过VS 新建一个网站 2.加入Global.asax 3.加入WebService 编辑 并 加入引用 4.对Global.as 效果:通过在网站的Global.asax的Application_Start方法中加入定时器 定时调用WebService该WebService的一个方法

Spring结合Quartz实现多任务定时调用

http://blog.csdn.net/oracle_microsoft/article/details/4412502 Quartz框架提供了丰富的任务调度支持,比如,在 何时执行何种任务,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它.无论是简单的任务调度,还是复杂的企业级应用,Quartz都能够很好地胜任.其中,这些任务可以是普通POJO,甚至还可以是EJB 3.0组件. 如果开发者需要开发如下方面的应用,则Quartz

java Timer(定时调用、实现固定时间执行)

最近需要用到定时调用的功能.可以通过java的Timer类来进行定时调用,下面是有关Timer的一些相关知识. 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样: Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("11232"); } },

Quartz结合SPRING多任务定时调用

public class QuartzJob  {       public void work()       {               System.out.println(Spring Quartz的任务调度1被调用!");               //定时调用的业务逻辑       }  }  public class QuartzJob2 {       public void work()       {               System.out.println(S

定时调用脚本,完成特定的业务

#/bin/sh #需要通过定时调用的http服务地址 serviceUrl="http://XXX.XXX.XXX.XXX:8080/p2p/loanCheck/dealFlowLoan" #服务名称,用于方便生成相应的log文件 serviceName="dealFlowLoan" #获取当前目录路径 filepath=$(cd "$(dirname "$0")"; pwd) #wget产生的临时文件存放目录 tmpfil

nodejs 定时调用shell脚本来备份数据库和日志文件并发送到邮箱

安装mailx,靠它来发送邮件 yum install mailx 编辑配置文件 vim /etc/mail.rc #添加如下内容 set [email protected] set smtp=smtp.163.com set [email protected] set smtp-auth-password=xxx set smtp-auth=login ---说明 from:对方收到邮件时显示的发件人 smtp:指定第三方发邮件的smtp服务器地址 set smtp-auth-user:第三方

滚动条(附:定时调用)

CSS: .rank{ width:88%;float:right;margin-left: 50px; height:50px; line-height:50px; overflow:hidden; white-space:nowrap;position:absolute;} .rank .rank_body{width:auto;font-size:16px; position: absolute; top:0; left:0; } HTML: <div class="rank&quo

JavaScript定时调用函数(SetInterval与setTimeout)

setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码. 不过这两个函数还是有区别的,setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout只执行一次那段代码. 区别:window.setTimeout("function",time)://设置一个超时对象,只执行一次,无周期 window.setInter

oracle中job定时调用存储过程的实例

使用job模拟定时从元数据表中抽取指定数据进入目标表的过程. 一.创建元数据表 --create table test_origianl create table test_original_data( id number(10,2) primary key, name varchar2(200), descCont varchar2(100), dateType char(5) ); 二.元数据表中插入数据 insert into test_original_data values(2.9,'