好久之前就用過quartz,如今從新用起,主要實現集羣方式啓動,而且支持多數據源注入到job中。網上demo不少,方法大同小異。但關於數據源注入的深刻介紹很少,不錯的文章:《spring-boot-2.0.3之quartz集成,數據源問題,源碼探究》,做者關於quartz有3篇,都值得一看。html
總結一下:mybatis不是必須的,springboot會自動將數據源注入到quartz(前提是你的配置正確)。本地化的job類也不是必須的,建立一個類主要是控制任務時傳參數。java
理論上來講,在數據庫中建好quartz的表,在pom中加入相關依賴,配置好quartz的屬性,無需額外編碼,就可讓quartz跑起來。只是這種狀況沒有任何任務,須要對任務進行增刪改啓停就須要實現一個service來操做job,這個類網上的demo幾乎都同樣,實現控制job的方法都是調用quartz的方法。mysql
要記錄的有幾點:web
一、我尚未完全弄清job的各類特性,包括任務的調度等,先從基本功能開始,知足業務須要便可。spring
二、踩了兩個坑,一個是依賴問題,在IDEA中能夠順暢的跑,但部署到服務器運行就會報錯(mybatis相關)。琢磨了好久,沒找到緣由,無心中發現多是依賴衝突致使,因而從零開始,力求最少依賴方式,個人依賴見下。第二個坑,使用了企業自研的分佈式數據庫(mysql),結果本機mysql正常,連企業數據庫就報錯:"Unknown column '0x' in 'field list'。最後dba查日誌發現是在向trigger表插入數據時blob字段沒按要求將0x用引號包起來。sql
三、接下來還須要嘗試使用jar進行任務定製,實現不動框架就能夠對job進行定製。數據庫
附pom及properties:tomcat
pom.xml,其中的mybatis是由於job要訪問業務數據庫才加入的依賴。springboot
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> </dependency> </dependencies>
application.properties。使用了druid的主從數據源(須要定義額外的配置類),quartz的表格部署在主庫上,springboot默認將主庫數據源注入到了quartz。服務器
#quartz相關屬性配置 spring.quartz.properties.org.quartz.scheduler.instanceName=myTasks spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000 spring.quartz.properties.org.quartz.jobStore.useProperties=false spring.quartz.properties.org.quartz.jobStore.dataSource=qzDS spring.quartz.properties.org.quartzthreadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartzthreadPool.threadCount=10 spring.quartz.properties.org.quartzthreadPool.threadPriority=5 spring.quartz.properties.org.quartzthreadPool.threadsInheritContextClassLoaderOfInitializingThread=true #數據庫方式 spring.quartz.job-store-type=JDBC #初始化表結構 spring.quartz.jdbc.initialize-schema=NEVER ## mysql 數據源配置,主庫Primary # via local mysql.datasource.druid.url = jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8&useSSL=false mysql.datasource.druid.username=root mysql.datasource.druid.password=123456 mysql.datasource.druid.driverClassName=com.mysql.jdbc.Driver #監控統計攔截的filters mysql.datasource.druid.filters=stat #配置初始化大小/最小/最大 mysql.datasource.druid.initialSize=1 mysql.datasource.druid.minIdle=1 mysql.datasource.druid.maxActive=20 #獲取鏈接等待超時時間 mysql.datasource.druid.maxWait=60000 #間隔多久進行一次檢測,檢測須要關閉的空閒鏈接 mysql.datasource.druid.timeBetweenEvictionRunsMillis=60000 #一個鏈接在池中最小生存的時間 mysql.datasource.druid.minEvictableIdleTimeMillis=300000 mysql.datasource.druid.validationQuery=SELECT 'x' mysql.datasource.druid.testWhileIdle=true mysql.datasource.druid.testOnBorrow=false mysql.datasource.druid.testOnReturn=false #打開PSCache,並指定每一個鏈接上PSCache的大小。oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false mysql.datasource.druid.poolPreparedStatements=false mysql.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20 ## Oracle 數據源配置,從庫 oracle.datasource.druid.url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=scot))) oracle.datasource.druid.username=root oracle.datasource.druid.password=123456 oracle.datasource.druid.driverClassName=oracle.jdbc.OracleDriver #監控統計攔截的filters oracle.datasource.druid.filters=stat #配置初始化大小/最小/最大 oracle.datasource.druid.initialSize=1 oracle.datasource.druid.minIdle=1 oracle.datasource.druid.maxActive=20 #獲取鏈接等待超時時間 oracle.datasource.druid.maxWait=60000 #間隔多久進行一次檢測,檢測須要關閉的空閒鏈接 oracle.datasource.druid.timeBetweenEvictionRunsMillis=60000 #一個鏈接在池中最小生存的時間 oracle.datasource.druid.minEvictableIdleTimeMillis=300000 oracle.datasource.druid.validationQuery=SELECT 'x' FROM DUAL oracle.datasource.druid.testWhileIdle=true oracle.datasource.druid.testOnBorrow=false oracle.datasource.druid.testOnReturn=false #打開PSCache,並指定每一個鏈接上PSCache的大小。oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false oracle.datasource.druid.poolPreparedStatements=true oracle.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20