文档章节

Job管理器

w
 wangshuaiJava
发布于 2015/09/22 11:05
字数 884
阅读 84
收藏 1

Job管理器是基于数据库管理Quartz Job任务,更方便管理Job的生命周期(Job管理器使用)

Quartz管理器主要特点:

  •  支持任务的启用、停用

  •  支持MySql、Oracle、DB2等多中数据库

  •  灵活便利的管理quartz任务

  •  支持多主机任务

  • 支持任务参数的传递

  • 一张表管理任务,简单便捷

  • 架构图如下所示:

         序列图如下所示:

   

 Quartz管理器表结构

    新增一条任务

同步任务代码

/**
	 * 扫描更新任务
	 */
	public synchronized IDataset<IData<String, Object>> getUpdateJob(
			QuartzManage quartzManageFactory) throws Exception {
		IDataset<IData<String, Object>> list = getQueryTask(getQueryTask());
		// 扫描表是否有删除的作业
		IDataset<IData<String, Object>> isJobDelete = isJobDelete(list);
		// 扫描表是否有更新的作业
		IDataset<IData<String, Object>> isJobUpdate = isJobUpdate(list);
		// 扫描表是否有新增的作业
		IDataset<IData<String, Object>> isJobAdd = isJobAdd(list);
		// 扫描表有删除移除任务
		if (isJobDelete.size() > 0) {
			for (IData<String, Object> data : isJobDelete) {
				if (!data.getString(JOB_CLASS).equals(TASK_JOB)) {
					quartzManageFactory.deleteJob(data.getString(JOB_ID),
							data.getString(JOB_GROUP));
				}
			}
		}
		// 扫描表有修改 先删除 在添加
		if (isJobUpdate.size() > 0) {
			for (IData<String, Object> data : isJobUpdate) {
				if (!data.getString(JOB_CLASS).equals(TASK_JOB)) {
					quartzManageFactory.deleteJob(data.getString(JOB_ID),
							data.getString(JOB_GROUP));
					// 作业开始时间
					Date startTime = DateUtils.strToDateLong(data
							.getString(JOB_START));
					// 作业结束时间
					Date endTime = DateUtils.strToDateLong(data
							.getString(JOB_END));
					// 加入调度
					quartzManageFactory.addJob(data.getString(JOB_ID),
							data.getString(JOB_GROUP),
							getParameters(data.getString(JOB_PARAMETERS)),
							data.getString(JOB_TIME),
							data.getString(JOB_CLASS), startTime, endTime);
				}
			}

		}

		// 扫描表新增添加任务
		if (isJobAdd.size() > 0) {
			for (IData<String, Object> data : isJobAdd) {
				if (!data.getString(JOB_CLASS).equals(TASK_JOB)) {
					// 作业开始时间
					Date startTime = DateUtils.strToDateLong(data
							.getString(JOB_START));
					// 作业结束时间
					Date endTime = DateUtils.strToDateLong(data
							.getString(JOB_END));
					// 加入调度
					quartzManageFactory.addJob(data.getString(JOB_ID),
							data.getString(JOB_GROUP),
							getParameters(data.getString(JOB_PARAMETERS)),
							data.getString(JOB_TIME),
							data.getString(JOB_CLASS), startTime, endTime);
				}
			}
		}

		setTaskMemory(list);
		return list;
	}


Quartz任务管理器

package com.venustech.quartz;

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 
 * @ClassName: QuartzManageImpl
 * @Description: TODO(job 工具类)
 * @author wangshuaiJAVA
 * @date 2014年12月29日 上午10:58:29
 *
 */
public class QuartzManageImpl implements QuartzManage {
	private Scheduler scheduler;
	private String jobPath;
	private final static int QUARTZ_HOURS_TYPE = 3;
	private final static int QUARTZ_SECONDS_TYPE = 1;
	private final static int QUARTZ_MINUTES_TYPE = 2;

	public QuartzManageImpl(String jobPath) throws SchedulerException {
		scheduler = new StdSchedulerFactory(jobPath).getScheduler();
	}

	public QuartzManageImpl() {
		super();
	}

	public void addJob(String jobName, String group,
			Map<String, Object> parameters, int intervalTime, int count,
			int type, Date startDate, String jobClassName) throws Exception {
		Trigger trigger = null;
		if (type == QuartzManageImpl.QUARTZ_SECONDS_TYPE) {
			trigger = newTrigger()
					.startAt(startDate)
					.withIdentity(jobName, group)
					.withSchedule(
							simpleSchedule()
									.withIntervalInSeconds(intervalTime)
									.withRepeatCount(count)).build();
		} else if (type == QuartzManageImpl.QUARTZ_MINUTES_TYPE) {
			trigger = newTrigger()
					.startAt(startDate)
					.withIdentity(jobName, group)
					.withSchedule(
							simpleSchedule()
									.withIntervalInMinutes(intervalTime)
									.withRepeatCount(count)).build();
		} else if (type == QuartzManageImpl.QUARTZ_HOURS_TYPE) {
			trigger = newTrigger()
					.startAt(startDate)
					.withIdentity(jobName, group)
					.withSchedule(
							simpleSchedule().withIntervalInHours(intervalTime)
									.withRepeatCount(count)).build();
		}
		JobDetail job = JobBuilder
				.newJob((Class<? extends Job>) Class.forName(jobClassName))
				.withIdentity(jobName, group).build();
		JobDataMap map = job.getJobDataMap();
		for (Entry<String, Object> entry : parameters.entrySet()) {
			map.put(entry.getKey(), entry.getValue());
		}
		scheduler.scheduleJob(job, trigger);
	}

	@Override
	public void addJob(String jobName, String group, int intervalTime,
			int count, int type, Date startDate) {

	}

	@Override
	public void addJob(String jobName, String group, int intervalTime,
			int count, int type) {
		// TODO Auto-generated method stub

	}

	@SuppressWarnings("unchecked")
	public void addJob(String jobName, String group,
			Map<String, Object> parameters, String time, String jobClassName,
			Date startTime, Date endTime) throws Exception {
		CronTrigger cronTrigger = TriggerBuilder.newTrigger()
				.withIdentity(jobName, group)
				.withSchedule(CronScheduleBuilder.cronSchedule(time))
				.startAt(startTime).endAt(endTime).build();
		JobDetail job = JobBuilder
				.newJob((Class<? extends Job>) Class.forName(jobClassName))
				.withIdentity(jobName, group).build();
		JobDataMap map = job.getJobDataMap();
		for (Entry<String, Object> entry : parameters.entrySet()) {
			map.put(entry.getKey(), entry.getValue());
		}
		scheduler.scheduleJob(job, cronTrigger);
	}

	@Override
	public boolean deleteJob(String jobName, String group) throws Exception {
		return scheduler.deleteJob(JobKey.jobKey(jobName, group));
	}

	@Override
	public boolean deleteJob(String jobName) throws Exception {
		return scheduler.deleteJob(JobKey.jobKey(jobName));

	}

	public Date upadteJobTime(String jobName, String group, String time)
			throws Exception {
		TriggerKey triggerKey = TriggerKey.triggerKey(jobName, group);
		CronTrigger cronTrigger = TriggerBuilder.newTrigger()
				.withIdentity(jobName, group)
				.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
		return scheduler.rescheduleJob(triggerKey, cronTrigger);
	}

	@Override
	public void pauseJob(String jobName, String group) throws Exception {

		scheduler.pauseJob(JobKey.jobKey(jobName, group));
	}

	@Override
	public void pauseJob(String jobName) throws Exception {
		scheduler.pauseJob(JobKey.jobKey(jobName));

	}

	@Override
	public void resumeJob(String jobName, String group) throws Exception {
		scheduler.resumeJob(JobKey.jobKey(jobName, group));
	}

	@Override
	public void resumeJob(String jobName) throws Exception {
		scheduler.resumeJob(JobKey.jobKey(jobName));

	}

	public String getJobPath() {
		return jobPath;
	}

	public void setJobPath(String jobPath) {
		this.jobPath = jobPath;
	}

	public Scheduler getScheduler() {
		return scheduler;
	}

	public void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}

	@Override
	public void initJob() {
		try {
			scheduler = new StdSchedulerFactory(jobPath).getScheduler();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void stopJob() {
		if (scheduler != null) {
			try {
				scheduler.shutdown();
			} catch (SchedulerException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	@Override
	public void startjob() {
		if (scheduler != null) {
			try {
				scheduler.start();
			} catch (SchedulerException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

© 著作权归作者所有

w
粉丝 1
博文 9
码字总数 11465
作品 0
武汉
私信 提问
加载中

评论(1)

不好好上班天天发动弹
不好好上班天天发动弹
吊!支持!学习了!
源码分析Elastic-Job前置篇二-基于Spring启动序列图与核心类图

本文主要目的:简单梳理了基于 Spring ElasticJob 的启动流程,从下文开始,将重点剖析 ElasticJob 的核心实现细节,例如选主、分片、失效转移机制等等。 1、在Spring中使用Elastic-Job的示例...

丁威
09/25
0
0
IsProcessInJob的返回值问题

在调试一个作业(Job)程序时发现,如下代码总是返回TRUE,无论是从VS中启动调试还是从资源管理器中启动。 BOOL bInJob = FALSE;IsProcessInJob(GetCurrentProcess(), NULL, &bInJob); 原来,从...

7分04秒
2014/12/07
63
0
spring batch的一个问题

最近一个项目中遇到这样一个问题使用spring batch 将一个数据库中的表定时迁移到 另一个数据库中,我看文档上有 text--》db 等方式,但是没有说 db--->db 再加上在配置的时候有如下一个配置就...

灯光下的宁静
2015/07/20
714
3
Hadoop之 - 剖析 MapReduce 作业的运行机制(MapReduce 2)

在0.20版本及更早期的系列中,mapred.job.tracker 决定了执行MapReduce程序的方式。如果这个配置属性被设置为local(默认值),则使用本地的作业运行器。运行器在耽搁JVM上运行整个作业。它被设...

yangji008
2016/11/20
0
0
Job Monarch 1.1 发布,Ganglia 监控插件

Job Monarch 1.1 发布了,Job Monarch 是 Ganglia 监控系统的插件,提供了批量作业监控。支持 Torque, PBS, 和 SLURM, 对 LSF 和 SGE 的支持还处于体验阶段。 该版本增加对 SLURM 工作负载管...

oschina
2013/05/24
714
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
27分钟前
7
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
51分钟前
28
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
10
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
892
13
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部