java开源定时任务管理_定时任务管理系统(Quartz和Spring的整合)开源和源码简述(三)...

本文介绍了如何使用Spring和Quartz创建一个纯后端的web项目,实现定时任务的增删改查、启停等功能。详细探讨了StdSchedulerFactory的getScheduler方法,涉及QuartzSchedulerThread的创建。项目已开源,欢迎参与改造。
摘要由CSDN通过智能技术生成

利用学习的时间这里写了个Spring和Quartz结合的一个web项目,纯后端的项目,restful接口

实现对定时任务的增、删、改、查、停止, 启动、定时规则修改、立即执行等。github地址:holly-quartz-web,这里刚开始是为了学习源码,后来有了一些改动,再后来就想做一些业务上的改造,所以clone了一个quartz-core的项目进行改造,后期打算对其集群方式进行改造等等。github地址:quartz-core,有一起感兴趣的朋友可以一起改造,目前的项目比较简单可以作为学习入门的项目,也可以作为搭建job管理系统的初期项目,慢慢迭代。

Scheduler newScheduler = schedulerFactory.getScheduler();

没有深入去说,今天来深入了解下。

其实这个方法涉及到整个scheduler的创建并涉及到核心类QuartzSchedulerThread。

这里的schedulerFactory我们知道是默认的实现类StdSchedulerFactory 来看一下它的getScheduler方法

public Scheduler getScheduler() throws SchedulerException {

if (cfg == null) {

initialize();

}

SchedulerRepository schedRep = SchedulerRepository.getInstance();

Scheduler sched = schedRep.lookup(getSchedulerName());

if (sched != null) {

if (sched.isShutdown()) {

schedRep.remove(getSchedulerName());

} else {

return sched;

}

}

sched = instantiate();

return sched;

}

重要的方法instantiate在这里亮相了

private Scheduler instantiate() throws SchedulerException {

if (cfg == null) {

initialize();

}

if (initException != null) {

throw initException;

}

JobStore js = null;

ThreadPool tp = null;

QuartzScheduler qs = null;

DBConnectionManager dbMgr = null;

String instanceIdGeneratorClass = null;

Properties tProps = null;

String userTXLocation = null;

boolean wrapJobInTx = false;

boolean autoId = false;

long idleWaitTime = -1;

long dbFailureRetry = 15000L; // 15 secs

String classLoadHelperClass;

String jobFactoryClass;

ThreadExecutor threadExecutor;

SchedulerRepository schedRep = SchedulerRepository.getInstance();

// Get Scheduler Properties

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

String schedName = cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,

"QuartzScheduler");

String threadName = cfg.getStringProperty(PROP_SCHED_THREAD_NAME,

schedName + "_QuartzSchedulerThread");

String schedInstId = cfg.getStringProperty(PROP_SCHED_INSTANCE_ID,

DEFAULT_INSTANCE_ID);

if (schedInstId.equals(AUTO_GENERATE_INSTANCE_ID)) {

autoId = true;

instanceIdGeneratorClass = cfg.getStringProperty(

PROP_SCHED_INSTANCE_ID_GENERATOR_CLASS,

"org.quartz.simpl.SimpleInstanceIdGenerator");

}

else if (schedInstId.equals(SYSTEM_PROPERTY_AS_INSTANCE_ID)) {

autoId = true;

instanceIdGeneratorClass =

"org.quartz.simpl.SystemPropertyInstanceIdGenerator";

}

userTXLocation = cfg.getStringProperty(PROP_SCHED_USER_TX_URL,

userTXLocation);

if (userTXLocation != null && userTXLocation.trim().length() == 0) {

userTXLocation = null;

}

classLoadHelperClass = cfg.getStringProperty(

PROP_SCHED_CLASS_LOAD_HELPER_CLASS,

"org.quartz.simpl.CascadingClassLoadHelper");

wrapJobInTx = cfg.getBooleanProperty(PROP_SCHED_WRAP_JOB_IN_USER_TX,

wrapJobInTx);

jobFactoryClass = cfg.getStringProperty(

PROP_SCHED_JOB_FACTORY_CLASS, null);

idleWaitTime = cfg.getLongProperty(PROP_SCHED_IDLE_WAIT_TIME,

idleWaitTime);

if(idleWaitTime > -1 && idleWaitTime < 1000) {

throw new SchedulerException("org.quartz.scheduler.idleWaitTime of less than 1000ms is not legal.");

}

dbFailureRetry = cfg.getLongProperty(PROP_SCHED_DB_FAILURE_RETRY_INTERVAL, dbFailureRetry);

if (dbFailureRetry < 0) {

throw new SchedulerException(PROP_SCHED_DB_FAILURE_RETRY_INTERVAL + " of less than 0 ms is not legal.");

}

boolean makeSchedulerThreadDaemon =

cfg.getBooleanProperty(PROP_SCHED_MAKE_SCHEDULER_THREAD_DAEMON);

boolean threadsInheritInitalizersClassLoader =

cfg.getBooleanProperty(PROP_SCHED_SCHEDULER_THREADS_INHERIT_CONTEXT_CLASS_LOADER_OF_INITIALIZING_THREAD);

long batchTimeWindow = cfg.getLongProperty(PROP_SCHED_BATCH_TIME_WINDOW, 0L);

int maxBatchSize = cfg.getIntProperty(PROP_SCHED_MAX_BATCH_SIZE, 1);

boolean interruptJobsOnShutdown = cfg.getBooleanProperty(PROP_SCHED_INTERRUPT_JOBS_ON_SHUTDOWN, false);

boolean interruptJobsOnShutdownWithWait = cfg.getBooleanProperty(PROP_SCHED_INTERRUPT_JOBS_ON_SHUTDOWN_WITH_WAIT, false);

boolean jmxExport = cfg.getBooleanProperty(PROP_SCHED_JMX_EXPORT);

String jmxObjectName = cfg.getStringProperty(PROP_SCHED_JMX_OBJECT_NAME);

boolean jmxProxy = cfg.getBooleanProperty(PROP_SCHED_JMX_PROXY);

String jmxProxyClass = cfg.getStringProperty(PROP_SCHED_JMX_PROXY_CLASS);

boolean rmiExport = cfg.getBooleanProperty(PROP_SCHED_RMI_EXPORT, false);

boolean rmiProxy = cfg.getBooleanProperty(PROP_SCHED_RMI_PROXY, false);

String rmiHost = cfg.getStringProperty(PROP_SCHED_RMI_HOST, "localhost");

int rmiPort = cfg.getIntProperty(PROP_SCHED_RMI_PORT, 1099);

int rmiServerPort = cfg.getIntProperty(PROP_SCHED_RMI_SERVER_PORT, -1);

String rmiCreateRegistry = cfg.getStringProperty(

PROP_SCHED_RMI_CREATE_REGISTRY,

QuartzSchedulerResources.CREATE_REGISTRY_NEVER);

String rmiBindName = cfg.getStringProperty(PROP_SCHED_RMI_BIND_NAME);

if (jmxProxy && rmiProxy) {

throw new SchedulerConfigException("Cannot proxy both RMI and JMX.");

}

boolean managementRESTServiceEnabled = cfg.getBooleanProperty(MANAGEMENT_REST_SERVICE_ENABLED, false);

String managementRESTServiceHostAndPort = cfg.getStringProperty(MANAGEMENT_REST_SERVICE_HOST_PORT, "0.0.0.0:9889");

Properties schedCtxtProps = cfg.getPropertyGroup(PROP_SCHED_CONTEXT_PREFIX, true);

// If Proxying to remote scheduler, short-circuit here...

// ~~~~~~~~~~~~~~~~~~

if (rmiProxy) {

if (autoId) {

schedInstId = DEFAULT_INSTANCE_ID;

}

String uid = (rmiBindName == null) ? QuartzSchedulerResources.getUniqueIdentifier(

schedName, schedInstId) : rmiBindName;

RemoteScheduler remoteScheduler = new RemoteScheduler(uid, rmiHost, rmiPort);

schedRep.bind(remoteScheduler);

return remoteScheduler;

}

// Create class load helper

ClassLoadHelper loadHelper = null;

try {

loadHelper = (ClassLoadHelper) loadClass(classLoadHelperClass)

.newInstance();

} catch (Exception e) {

throw new SchedulerConfigException(

"Unable to instantiate class load helper class: "

+ e.getMessage(), e);

}

loadHelper.initialize();

// If Proxying to remote JMX scheduler, short-circuit here...

// ~~~~~~~~~~~~~~~~~~

if (jmxProxy) {

if (autoId) {

schedInstId = DEFAULT_INSTANCE_ID;

}

if (jmxProxyClass == null) {

throw new SchedulerConfigException("No JMX Proxy Scheduler class provided");

}

RemoteMBeanScheduler jmxScheduler = null;

try {

jmxScheduler = (RemoteM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值