加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

杂谈篇之我是怎么读源码的,授之以渔

发布时间:2019-02-22 12:06:43 所属栏目:建站 来源:liujh
导读:读源码的经验 刚介入事变那会,没想已往读源码,更没想已往改框架的源码;总想着别人的框架应该是美满的、全能的,应该不必要改;其它纵然我改了源码,怎么样让我的窜改见效了? 项目中引用的不照旧没改的jar包吗。追念起来认为当时辰的设法确实挺...... 事变

下面我会举例来声名我是怎样举办断点追踪的,以spring-boot-2.0.3之quartz集成,不是你想的那样哦!和 spring-boot-2.0.3之quartz集成,数据源题目,源码探讨 为配景来讲,必要搞清晰两个点:springboot是怎样向quartz注入数据源的,quartz是怎样操纵数据库的

springboot向quartz注入数据源

QuartzAutoConfiguration是springboot自动设置quartz的进口

将quartz的设置属性配置给SchedulerFactoryBean;将数据源配置给SchedulerFactoryBean:假若有@QuartzDataSource修饰的数据源,则将@QuartzDataSource修饰的数据源配置给SchedulerFactoryBean,不然将应用的数据源(druid数据源)配置给SchedulerFactoryBean,显然我们的应用中没有@QuartzDataSource修饰的数据源,那么SchedulerFactoryBean中的数据源就是应用的数据源;将事宜打点器配置给SchedulerFactoryBean。SchedulerFactoryBean,认真建设和设置quartz Scheduler,并将其注册到spring容器中。SchedulerFactoryBean实现InitializingBean的afterPropertiesSet要领,内里有可以配置数据源的进程

可以看到通过org.quartz.jobStore.dataSource配置的dsName(值为quartzDs)最后会被替代成springTxDataSource.加scheduler实例名(我们的应用中是:springTxDataSource.quartzScheduler)。springboot会注册两个ConnectionProvider给quartz:一个dsName叫springTxDataSource.quartzScheduler,有事宜;一个dsName叫springNonTxDataSource.quartzScheduler,没事宜。

quartz怎样操纵数据库

我们通过遏制按时使命来跟下quartz对数据库的操纵

发明quartz用如下方法获取connection

  1. conn = DBConnectionManager.getInstance().getConnection(getDataSource()); 

那么我们的job中就可以按如下方法操纵数据库了

  1. package com.lee.quartz.job; 
  2. import org.quartz.JobExecutionContext; 
  3. import org.quartz.JobExecutionException; 
  4. import org.quartz.utils.DBConnectionManager; 
  5. import org.springframework.scheduling.quartz.LocalDataSourceJobStore; 
  6. import org.springframework.scheduling.quartz.QuartzJobBean; 
  7. import java.sql.Connection; 
  8. import java.sql.PreparedStatement; 
  9. import java.sql.SQLException; 
  10. public class FetchDataJob extends QuartzJobBean { 
  11.  // private String dataSourceName = "quartzDs"; // 用此会找不到 
  12.  // private String dataSourceName = "springNonTxDataSource.quartzScheduler"; // 不支持事宜 
  13.  // private String dataSourceName = "springTxDataSource.quartzScheduler"; // 支持事宜 
  14.  private final String insertSql = "INSERT INTO tbl_sys_user(name, age) VALUES(?,?) "; 
  15.  private String schedulerInstanceName = "quartzScheduler"; // 可通过jobDataMap注入进来 
  16.  @Override 
  17.  protected void executeInternal(JobExecutionContext context) throws JobExecutionException { 
  18.  String dsName = LocalDataSourceJobStore.NON_TX_DATA_SOURCE_PREFIX 
  19.  + schedulerInstanceName; // 不支持事宜 
  20.  //String dsName = LocalDataSourceJobStore.TX_DATA_SOURCE_PREFIX + schedulerInstanceName; // 支持事宜 
  21.  try { 
  22.  Connection connection = DBConnectionManager.getInstance().getConnection(dsName); 
  23.  PreparedStatement ps = connection.prepareStatement(insertSql); 
  24.  ps.setString(1, "张三"); 
  25.  ps.setInt(2, 25); 
  26.  ps.executeUpdate(); 
  27.  ps.close(); 
  28.  connection.close(); // 将毗连偿还给毗连池 
  29.  System.out.println("插入乐成"); 
  30.  } catch (SQLException e) { 
  31.  e.printStackTrace(); 
  32.  } 
  33.  } 
  34.  public void setSchedulerInstanceName(String schedulerInstanceName) { 
  35.  this.schedulerInstanceName = schedulerInstanceName; 
  36.  } 

明晰我们的目标,找到吻合的切入点,进入断点调试追踪也就轻易了。

任我说的口不择言,你仍无动于衷,那壹贝偾我一厢甘心,只有局中人才气领会到个中的微妙!

总结与感悟

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读