2019独角兽企业重金招聘Python工程师标准>>>

Quartz的使用:http://donald-draper.iteye.com/blog/2321886 
Quartz的Scheduler初始化源码分析:http://donald-draper.iteye.com/blog/2322730 
Quartz的job、触发器的暂停与恢复源码分析:http://donald-draper.iteye.com/blog/2322823 
Quartz的Job存储,触发器、任务删除,源码分析:http://donald-draper.iteye.com/blog/2322725 
Quartzs的job,trriger监听器源码分析:http://donald-draper.iteye.com/blog/2322863 
Quartz 任务存储JobStoreTX 持久化之RDB:http://donald-draper.iteye.com/blog/2323297 
Quartz 任务存储JobStoreTX 持久化之RDB-源码分析:http://donald-draper.iteye.com/blog/2323409 
Quartz任务调度源码分析:http://donald-draper.iteye.com/blog/2323118 
Spring与Quartz集成详解:http://donald-draper.iteye.com/blog/2323591 
Spring与Quartz集成-源码分析:http://donald-draper.iteye.com/blog/2324132

一般获取Scheduler的方式 
第一种:

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler cronScheduler = schedulerFactory.getScheduler();  

第二种:

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();  

下面先来看看第一种到底做了些什么

public class StdSchedulerFactory  implements SchedulerFactory
{  //获取调度器Scheduler  public Scheduler getScheduler()  throws SchedulerException  {  if(cfg == null)  //初始化Quartz属性,线程池,线程数,线程优先级,job存储容器  initialize();  //获取调度器仓库单例  SchedulerRepository schedRep = SchedulerRepository.getInstance();  //根据调度器name,寻到对应的Scheduler  Scheduler sched = schedRep.lookup(getSchedulerName());  if(sched != null)  if(sched.isShutdown())  schedRep.remove(getSchedulerName());  else  return sched;  //初始化调度器  sched = instantiate();  return sched;  }  //从StdSchedulerFactory的getDefaultScheduler方法可以看出  //与getScheduler相同  public static Scheduler getDefaultScheduler()  throws SchedulerException  {  StdSchedulerFactory fact = new StdSchedulerFactory();  return fact.getScheduler();  }  //初始化Quartz属性,线程池,线程数,线程优先级,job存储容器配置  public void initialize()  throws SchedulerException  {  String requestedFile;  String propFileName;  File propFile;  Properties props;  InputStream in;  if(cfg != null)  return;  if(initException != null)  throw initException;  requestedFile = System.getProperty("org.quartz.properties");  propFileName = requestedFile == null ? "quartz.properties" : requestedFile;  propFile = new File(propFileName);  props = new Properties();  in = null;  //如果propFile存在,则从文件系统,加载相应的属性文件  if(propFile.exists())  try  {  if(requestedFile != null)  propSrc = (new StringBuilder()).append("specified file: '").append(requestedFile).append("'").toString();  else  propSrc = "default file in current working dir: 'quartz.properties'";  in = new BufferedInputStream(new FileInputStream(propFileName));  props.load(in);  }  catch(IOException ioe)  {  initException = new SchedulerException((new StringBuilder()).append("Properties file: '").append(propFileName).append("' could not be read.").toString(), ioe);  throw initException;  }  else  //如果org.quartz.propertiess属性文件不为null,则从当前Thread的ClassLoader的Context加载相应的属性文件  if(requestedFile != null)  {  in = Thread.currentThread().getContextClassLoader().getResourceAsStream(requestedFile);  if(in == null)  {  initException = new SchedulerException((new StringBuilder()).append("Properties file: '").append(requestedFile).append("' could not be found.").toString());  throw initException;  }  propSrc = (new StringBuilder()).append("specified file: '").append(requestedFile).append("' in the class resource path.").toString();  in = new BufferedInputStream(in);  try  {  props.load(in);  }  catch(IOException ioe)  {  initException = new SchedulerException((new StringBuilder()).append("Properties file: '").append(requestedFile).append("' could not be read.").toString(), ioe);  throw initException;  }  } else  {  propSrc = "default resource file in Quartz package: 'quartz.properties'";  ClassLoader cl = getClass().getClassLoader();  if(cl == null)  cl = findClassloader();  if(cl == null)  throw new SchedulerConfigException("Unable to find a class loader on the current thread or class.");  in = cl.getResourceAsStream("quartz.properties");  if(in == null)  in = cl.getResourceAsStream("/quartz.properties");  if(in == null)  in = cl.getResourceAsStream("org/quartz/quartz.properties");  if(in == null)  {  initException = new SchedulerException("Default quartz.properties not found in class path");  throw initException;  }  try  {  props.load(in);  }  catch(IOException ioe)  {  initException = new SchedulerException("Resource properties file: 'org/quartz/quartz.properties' could not be read from the classpath.", ioe);  throw initException;  }  }  if(in != null)  try  {  in.close();  }  catch(IOException ignore) { }  break MISSING_BLOCK_LABEL_502;  Exception exception;  exception;  if(in != null)  try  {  in.close();  }  catch(IOException ignore) { }  throw exception;  initialize(overrideWithSysProps(props));  return;  }  //重载系统属性  private Properties overrideWithSysProps(Properties props)  {  Properties sysProps = null;  try  {  sysProps = System.getProperties();  }  catch(AccessControlException e)  {  getLog().warn("Skipping overriding quartz properties with System properties during initialization because of an AccessControlException.  This is likely due to not having read/write access for java.util.PropertyPermission as required by java.lang.System.getProperties().  To resolve this warning, either add this permission to your policy file or use a non-default version of initialize().", e);  }  if(sysProps != null)  props.putAll(sysProps);  return props;  }  //初始化PropertiesParser  public void initialize(Properties props)  throws SchedulerException  {  if(propSrc == null)  propSrc = "an externally provided properties instance.";  cfg = new PropertiesParser(props);  }  //初始化Quartz属性,线程池,线程数,线程优先级,job存储容器  private Scheduler instantiate()  throws SchedulerException  {     JobStore js;//job存储器  ThreadPool tp;// 线程池  QuartzScheduler qs;  DBConnectionManager dbMgr;//数据库连接管理器  ThreadExecutor threadExecutor;//线程执行器  SchedulerRepository schedRep;//调度器仓库  boolean makeSchedulerThreadDaemon;//Scheduler调度线程方式前台,守候  boolean threadsInheritInitalizersClassLoader;//线程初始化继承属性  long batchTimeWindow;  int maxBatchSize;  if(cfg == null)//initialize(Properties props)已经初始化cfg  initialize();  if(initException != null)  throw initException;  //初始化相关属性  schedRep = SchedulerRepository.getInstance();  schedName = cfg.getStringProperty("org.quartz.scheduler.instanceName", "QuartzScheduler");  threadName = cfg.getStringProperty("org.quartz.scheduler.threadName", (new StringBuilder()).append(schedName).append("_QuartzSchedulerThread").toString());  schedInstId = cfg.getStringProperty("org.quartz.scheduler.instanceId", "NON_CLUSTERED")  String classLoadHelperClass = cfg.getStringProperty("org.quartz.scheduler.classLoadHelper.class", "org.quartz.simpl.CascadingClassLoadHelper");  String jobFactoryClass = cfg.getStringProperty("org.quartz.scheduler.jobFactory.class", null);  batchTimeWindow = cfg.getLongProperty("org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow", 0L);  maxBatchSize = cfg.getIntProperty("org.quartz.scheduler.batchTriggerAcquisitionMaxCount", 1);  jmxExport = cfg.getBooleanProperty("org.quartz.scheduler.jmx.export");  jmxObjectName = cfg.getStringProperty("org.quartz.scheduler.jmx.objectName");  boolean jmxProxy = cfg.getBooleanProperty("org.quartz.scheduler.jmx.proxy");  String jmxProxyClass = cfg.getStringProperty("org.quartz.scheduler.jmx.proxy.class");  loadHelper.initialize();  //初始化JMX Proxy  if(jmxProxy)  {  if(autoId)  schedInstId = "NON_CLUSTERED";  if(jmxProxyClass == null)  throw new SchedulerConfigException("No JMX Proxy Scheduler class provided");  RemoteMBeanScheduler jmxScheduler = null;  try  {  jmxScheduler = (RemoteMBeanScheduler)loadHelper.loadClass(jmxProxyClass).newInstance();  }  if(jmxObjectName == null)  jmxObjectName = QuartzSchedulerResources.generateJMXObjectName(schedName, schedInstId);  jmxScheduler.setSchedulerObjectName(jmxObjectName);  tProps = cfg.getPropertyGroup("org.quartz.scheduler.jmx.proxy", true);  try  {  setBeanProps(jmxScheduler, tProps);  }            jmxScheduler.initialize();  schedRep.bind(jmxScheduler);  return jmxScheduler;  }  jobFactory = null;  //初始化jobFactory  if(jobFactoryClass != null)  {  try  {  jobFactory = (jobFactory)loadHelper.loadClass(jobFactoryClass).newInstance();  }  tProps = cfg.getPropertyGroup("org.quartz.scheduler.jobFactory", true);  try  {  setBeanProps(jobFactory, tProps);  }  }  //加载JobStore,org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore   try  {  js = (JobStore)loadHelper.loadClass(jsClass).newInstance();  }  //如果org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX ,配置数据库信息  String dsNames[] = cfg.getPropertyGroups("org.quartz.dataSource");  for(int i = 0; i < dsNames.length; i++)  {  PropertiesParser pp = new PropertiesParser(cfg.getPropertyGroup((new StringBuilder()).append("org.quartz.dataSource.").append(dsNames[i]).toString(), true));  String cpClass = pp.getStringProperty("connectionProvider.class", null);  if(cpClass != null)  {  ConnectionProvider cp = null;  try  {  cp = (ConnectionProvider)loadHelper.loadClass(cpClass).newInstance();  }                try  {  pp.getUnderlyingProperties().remove("connectionProvider.class");  setBeanProps(cp, pp.getUnderlyingProperties());  cp.initialize();  }  dbMgr = DBConnectionManager.getInstance();  dbMgr.addConnectionProvider(dsNames[i], cp);  continue;  }  try  {  PoolingConnectionProvider cp = new PoolingConnectionProvider(pp.getUnderlyingProperties());  dbMgr = DBConnectionManager.getInstance();  dbMgr.addConnectionProvider(dsNames[i], cp);  continue;  }  }  //初始化插件  pluginNames = cfg.getPropertyGroups("org.quartz.plugin");  plugins = new SchedulerPlugin[pluginNames.length];  for(int i = 0; i < pluginNames.length; i++)  {  Properties pp = cfg.getPropertyGroup((new StringBuilder()).append("org.quartz.plugin.").append(pluginNames[i]).toString(), true);  String plugInClass = pp.getProperty("class", null);  if(plugInClass == null)  {  initException = new SchedulerException((new StringBuilder()).append("SchedulerPlugin class not specified for plugin '").append(pluginNames[i]).append("'").toString());  throw initException;  }  SchedulerPlugin plugin = null;  try  {  plugin = (SchedulerPlugin)loadHelper.loadClass(plugInClass).newInstance();  }  try  {  setBeanProps(plugin, pp);  }  plugins[i] = plugin;  }  //job监听器  String jobListenerNames[] = cfg.getPropertyGroups("org.quartz.jobListener");  jobListeners = new JobListener[jobListenerNames.length];  for(int i = 0; i < jobListenerNames.length; i++)  {  Properties lp = cfg.getPropertyGroup((new StringBuilder()).append("org.quartz.jobListener.").append(jobListenerNames[i]).toString(), true);  String listenerClass = lp.getProperty("class", null);  if(listenerClass == null)  {  initException = new SchedulerException((new StringBuilder()).append("JobListener class not specified for listener '").append(jobListenerNames[i]).append("'").toString());  throw initException;  }  JobListener listener = null;  try  {  listener = (JobListener)loadHelper.loadClass(listenerClass).newInstance();  }  try  {  Method nameSetter = null;  try  {  nameSetter = listener.getClass().getMethod("setName", strArg);  }                if(nameSetter != null)  nameSetter.invoke(listener, new Object[] {  jobListenerNames[i]  });  setBeanProps(listener, lp);  }           jobListeners[i] = listener;  }  //Trrige监听器  String triggerListenerNames[] = cfg.getPropertyGroups("org.quartz.triggerListener");  triggerListeners = new TriggerListener[triggerListenerNames.length];  for(int i = 0; i < triggerListenerNames.length; i++)  {  Properties lp = cfg.getPropertyGroup((new StringBuilder()).append("org.quartz.triggerListener.").append(triggerListenerNames[i]).toString(), true);  String listenerClass = lp.getProperty("class", null);  if(listenerClass == null)  {  initException = new SchedulerException((new StringBuilder()).append("TriggerListener class not specified for listener '").append(triggerListenerNames[i]).append("'").toString());  throw initException;  }  TriggerListener listener = null;  try  {  listener = (TriggerListener)loadHelper.loadClass(listenerClass).newInstance();  }  try  {  Method nameSetter = null;  try  {  nameSetter = listener.getClass().getMethod("setName", strArg);  }  if(nameSetter != null)  nameSetter.invoke(listener, new Object[] {  triggerListenerNames[i]  });  setBeanProps(listener, lp);  }  triggerListeners[i] = listener;  }  //初始化线程池执行类  String threadExecutorClass = cfg.getStringProperty("org.quartz.threadExecutor.class");  if(threadExecutorClass != null)  {  tProps = cfg.getPropertyGroup("org.quartz.threadExecutor", true);  try  {  threadExecutor = (ThreadExecutor)loadHelper.loadClass(threadExecutorClass).newInstance();  log.info((new StringBuilder()).append("Using custom implementation for ThreadExecutor: ").append(threadExecutorClass).toString());  setBeanProps(threadExecutor, tProps);  }  } else  {  log.info("Using default implementation for ThreadExecutor");  threadExecutor = new DefaultThreadExecutor();  }  Scheduler scheduler;  //初始化job执行器  JobRunShellFactory jrsf = null;  if(userTXLocation != null)  UserTransactionHelper.setUserTxLocation(userTXLocation);  if(wrapJobInTx)  jrsf = new JTAJobRunShellFactory();  else  jrsf = new JTAAnnotationAwareJobRunShellFactory();  if(autoId)  try  {  schedInstId = "NON_CLUSTERED";  if(js.isClustered())  schedInstId = instanceIdGenerator.generateInstanceId();  }  catch(Exception e)  {  getLog().error("Couldn't generate instance Id!", e);  throw new IllegalStateException("Cannot run without an instance id.");  }  if(js.getClass().getName().startsWith("org.terracotta.quartz"))  {  try  {  String uuid = (String)js.getClass().getMethod("getUUID", new Class[0]).invoke(js, new Object[0]);  if(schedInstId.equals("NON_CLUSTERED"))  {  schedInstId = (new StringBuilder()).append("TERRACOTTA_CLUSTERED,node=").append(uuid).toString();  if(jmxObjectName == null)  jmxObjectName = QuartzSchedulerResources.generateJMXObjectName(schedName, schedInstId);  } else  if(jmxObjectName == null)  jmxObjectName = QuartzSchedulerResources.generateJMXObjectName(schedName, (new StringBuilder()).append(schedInstId).append(",node=").append(uuid).toString());  }  catch(Exception e)  {  throw new RuntimeException("Problem obtaining node id from TerracottaJobStore.", e);  }  if(null == cfg.getStringProperty("org.quartz.scheduler.jmx.export"))  jmxExport = true;  }  if(js instanceof JobStoreSupport)  {  JobStoreSupport jjs = (JobStoreSupport)js;  jjs.setDbRetryInterval(dbFailureRetry);  if(threadsInheritInitalizersClassLoader)  jjs.setThreadsInheritInitializersClassLoadContext(threadsInheritInitalizersClassLoader);  jjs.setThreadExecutor(threadExecutor);  }  //QuartzScheduler资源管理器  QuartzSchedulerResources rsrcs = new QuartzSchedulerResources();  rsrcs.setName(schedName);  rsrcs.setThreadName(threadName);  rsrcs.setInstanceId(schedInstId);  rsrcs.setJobRunShellFactory(jrsf);  rsrcs.setMakeSchedulerThreadDaemon(makeSchedulerThreadDaemon);  rsrcs.setThreadsInheritInitializersClassLoadContext(threadsInheritInitalizersClassLoader);  rsrcs.setRunUpdateCheck(!skipUpdateCheck);  rsrcs.setBatchTimeWindow(batchTimeWindow);  rsrcs.setMaxBatchSize(maxBatchSize);  rsrcs.setInterruptJobsOnShutdown(interruptJobsOnShutdown);  rsrcs.setInterruptJobsOnShutdownWithWait(interruptJobsOnShutdownWithWait);  rsrcs.setJMXExport(jmxExport);  rsrcs.setJMXObjectName(jmxObjectName);  if(managementRESTServiceEnabled)  {  ManagementRESTServiceConfiguration managementRESTServiceConfiguration = new ManagementRESTServiceConfiguration();  managementRESTServiceConfiguration.setBind(managementRESTServiceHostAndPort);  managementRESTServiceConfiguration.setEnabled(managementRESTServiceEnabled);  rsrcs.setManagementRESTServiceConfiguration(managementRESTServiceConfiguration);  }  if(rmiExport)  {  rsrcs.setRMIRegistryHost(rmiHost);  rsrcs.setRMIRegistryPort(rmiPort);  rsrcs.setRMIServerPort(rmiServerPort);  rsrcs.setRMICreateRegistryStrategy(rmiCreateRegistry);  rsrcs.setRMIBindName(rmiBindName);  }  SchedulerDetailsSetter.setDetails(tp, schedName, schedInstId);  rsrcs.setThreadExecutor(threadExecutor);  //线程池初始化  threadExecutor.initialize();  rsrcs.setThreadPool(tp);  if((tp instanceof SimpleThreadPool) && threadsInheritInitalizersClassLoader)  ((SimpleThreadPool)tp).setThreadsInheritContextClassLoaderOfInitializingThread(threadsInheritInitalizersClassLoader);  tp.initialize();  tpInited = true;  rsrcs.setJobStore(js);  for(int i = 0; i < plugins.length; i++)  rsrcs.addSchedulerPlugin(plugins[i]);  //新建QuartzScheduler  qs = new QuartzScheduler(rsrcs, idleWaitTime, dbFailureRetry);  qsInited = true;  //初始化scheduler  scheduler = instantiate(rsrcs, qs);  if(jobFactory != null)  qs.setJobFactory(jobFactory);  for(int i = 0; i < plugins.length; i++)  plugins[i].initialize(pluginNames[i], scheduler, loadHelper);  for(int i = 0; i < jobListeners.length; i++)  qs.getListenerManager().addJobListener(jobListeners[i], EverythingMatcher.allJobs());  for(int i = 0; i < triggerListeners.length; i++)  qs.getListenerManager().addTriggerListener(triggerListeners[i], EverythingMatcher.allTriggers());  Object key;  String val;  for(Iterator i$ = schedCtxtProps.keySet().iterator(); i$.hasNext(); scheduler.getContext().put((String)key, val))  {  key = i$.next();  val = schedCtxtProps.getProperty((String)key);  }  js.setInstanceId(schedInstId);  js.setInstanceName(schedName);  js.setThreadPoolSize(tp.getPoolSize());  js.initialize(loadHelper, qs.getSchedulerSignaler());  jrsf.initialize(scheduler);  qs.initialize();  getLog().info((new StringBuilder()).append("Quartz scheduler '").append(scheduler.getSchedulerName()).append("' initialized from ").append(propSrc).toString());  getLog().info((new StringBuilder()).append("Quartz scheduler version: ").append(qs.getVersion()).toString());  qs.addNoGCObject(schedRep);  if(dbMgr != null)  qs.addNoGCObject(dbMgr);  //绑定scheduler到调度器仓库  schedRep.bind(scheduler);  return scheduler;//实际为QuartzScheduler
}
//初始化Scheduler  protected Scheduler instantiate(QuartzSchedulerResources rsrcs, QuartzScheduler qs)  {  Scheduler scheduler = new StdScheduler(qs);  return scheduler;  }  //解析quartz.properties配置文件属性  private PropertiesParser cfg;
}  

//调度器仓库

public class SchedulerRepository
{  private SchedulerRepository()  {  schedulers = new HashMap();  }  //获取调度器仓库单例  public static synchronized SchedulerRepository getInstance()  {  if(inst == null)  inst = new SchedulerRepository();  return inst;  }  //添加调度器到仓库  public synchronized void bind(Scheduler sched)  throws SchedulerException  {  if((Scheduler)schedulers.get(sched.getSchedulerName()) != null)  {  throw new SchedulerException((new StringBuilder()).append("Scheduler with name '").append(sched.getSchedulerName()).append("' already exists.").toString());  } else  {  schedulers.put(sched.getSchedulerName(), sched);  return;  }  }  public synchronized boolean remove(String schedName)  {  return schedulers.remove(schedName) != null;  }  //根据调度器name,寻到对应的Scheduler  public synchronized Scheduler lookup(String schedName)  {  return (Scheduler)schedulers.get(schedName);  }  public synchronized Collection lookupAll()  {  return Collections.unmodifiableCollection(schedulers.values());  }  private HashMap schedulers;//Hash<String,Scheduler>  private static SchedulerRepository inst;
} 

//标准执行器实际上是包装了QuartzScheduler

public class StdScheduler  implements Scheduler
{  public StdScheduler(QuartzScheduler sched)  {  this.sched = sched;  }  private QuartzScheduler sched;
} 

//调度器

public class QuartzScheduler  implements RemotableQuartzScheduler
{  public QuartzScheduler(QuartzSchedulerResources resources, long idleWaitTime, long dbRetryInterval)  throws SchedulerException  {  }  private static String VERSION_MAJOR;  private static String VERSION_MINOR;  private static String VERSION_ITERATION;  private QuartzSchedulerResources resources;  private QuartzSchedulerThread schedThread;  private ThreadGroup threadGroup;  private SchedulerContext context;  private ListenerManager listenerManager;  private HashMap internalJobListeners;  private HashMap internalTriggerListeners;  private ArrayList internalSchedulerListeners;  private JobFactory jobFactory;  ExecutingJobsManager jobMgr;  ErrorLogger errLogger;  private SchedulerSignaler signaler;  private Random random;  private ArrayList holdToPreventGC;  private boolean signalOnSchedulingChange;  private volatile boolean closed;  private volatile boolean shuttingDown;  private boolean boundRemotely;  private QuartzSchedulerMBean jmxBean;  private Date initialStart;  private final Timer updateTimer;  private final Logger log = LoggerFactory.getLogger(getClass());
} 

//QuartzScheduler的资源管理器

public class QuartzSchedulerResources
{  public static final String CREATE_REGISTRY_NEVER = "never";  public static final String CREATE_REGISTRY_ALWAYS = "always";  public static final String CREATE_REGISTRY_AS_NEEDED = "as_needed";  private String name;  private String instanceId;  private String threadName;  private String rmiRegistryHost;  private int rmiRegistryPort;  private int rmiServerPort;  private String rmiCreateRegistryStrategy;  private ThreadPool threadPool;  private JobStore jobStore;  private JobRunShellFactory jobRunShellFactory;  private List schedulerPlugins;  private boolean makeSchedulerThreadDaemon;  private boolean threadsInheritInitializersClassLoadContext;  private String rmiBindName;  private boolean jmxExport;  private String jmxObjectName;  private ManagementRESTServiceConfiguration managementRESTServiceConfiguration;  private ThreadExecutor threadExecutor;  private boolean runUpdateCheck;  private long batchTimeWindow;  private int maxBatchSize;  private boolean interruptJobsOnShutdown;  private boolean interruptJobsOnShutdownWithWait;
}  

从StdSchedulerFactory的getDefaultScheduler方法可以看出与getScheduler相同 
总结: 
从以上代码分析中,看出StdSchedulerFactory获取执行器,首先从调度器仓库获取调度器,如果为空,则配置属性cfg,如果cfg为空则初始化属性文件,如果没有配置属性文件,则加载默认属性;然后初始化调度器(线程池,存储器,job,trriger监控器,JMX,及调度器仓库,如果存储器为JobStoreTX ,则初始化数据库信息);从返回的调度器来看实际上就是QuartzScheduler

转载于:https://my.oschina.net/u/2391658/blog/1552095

Quartz的Scheduler初始化源码分析相关推荐

  1. 【SemiDrive源码分析】【X9芯片启动流程】12 - freertos_safetyos目录Cortex-R5 DIL2.bin 之 sdm_display_init 显示初始化源码分析

    [SemiDrive源码分析][X9芯片启动流程]12 - freertos_safetyos目录Cortex-R5 DIL2.bin 之 sdm_display_init 显示初始化源码分析 一.s ...

  2. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...

  3. 深入理解Spring之九:DispatcherServlet初始化源码分析

    转载 https://mp.weixin.qq.com/s/UF9s52CBzEDmD0bwMfFw9A DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请 ...

  4. 【Spring】IOC:基于注解的IOC容器初始化源码分析

    从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...

  5. scrapy源码2:scheduler的源码分析

    一. scheduler核心 Scheduler主要负责scrapy请求队列的管理,即进队与出队.进一步来说,会涉及到队列的选择,队列去重,序列化. from_crawler(cls, crawler ...

  6. Spring 事务初始化源码分析

    前言 在上篇文章 Spring 事务使用详解 中详细介绍了 Spring 事务的使用过程,今天就来看下 Spring 事务是如何来实现,比如 Spring 事务在初始化的时候做了什么,Spring 事 ...

  7. Struts2初始化流程及源码分析

    1.1 Struts2初始化 在讲Struts2的初始化之前,应该为大家描述下Web应用中的过滤器Filter,这关系到我们对核心过滤器FilterDispatcher的正确理解. Filter:一个 ...

  8. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  9. 【SemiDrive源码分析】系列文章链接汇总(全)

    注意:兄弟们,因为要换工作了,本专栏暂时先不更新了,如果后续工作也涉及芯驰平台的话,那我还会继续更新下去. 有好工作机会的兄弟,也可以私信介绍给我,可以聊聊 谢谢!!! 注意:兄弟们,因为一些其他原因 ...

最新文章

  1. Cache 工作原理,Cache 一致性,你想知道的都在这里
  2. firefox扩展开发(二):用XUL创建窗口控件
  3. .NET+Sqlite如何支持加密
  4. 【iVX 初级工程师培训教程 10篇文拿证】05 画布及飞机大战游戏制作
  5. 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
  6. Android TextureView简易教程
  7. AFM测试探针简介-科学指南针
  8. 【转载】国产手机MTK平台MRP软件应用安装大全
  9. 安装unbuntu,vmware傻瓜式笔记
  10. openerp环境的搭建
  11. 知名大咖、一线品牌齐聚!机智云助力电动车锂电新时代!
  12. 各种各样的搜索(⊙ ▽ ⊙)(1)
  13. 深度学习中的正则化方法
  14. springboot 配置文件 date-format 失效
  15. 交易中的 “道“ 与 “术“
  16. 将BMP 格式图片转换为 JPEG 格式【c语言】
  17. Codeforces-1008A - Romaji - 水题
  18. 面试题大全<持续更新>
  19. ChinaSkills-网络系统管理002(国赛所提供完整软件包组)
  20. 全球首个开源图像识别系统上线了!

热门文章

  1. GDI+编程说明及小结
  2. 虚拟化 - 每天5分钟玩转 OpenStack(2)
  3. navbar build by Bootstrap3.x + RubyOnRails +Haml
  4. 2012 12 12 (109)闪回操作
  5. AB_PLC_入门教程
  6. 还原活动目录完全手册
  7. 面試隨筆---數字轉RMB中文 之 我的实现(含图)
  8. 【前端笔记】Vuex 是什么,为什么需要
  9. Alluxio HA 写入文件失败
  10. 跨域以及一些解决方法