很久以前就用過quartz,現在重新用起,主要實現集群方式啟動,並且支持多數據源注入到job中。網上demo很多,方法大同小異。但關於數據源注入的深入介紹不多,不錯的文章:《spring-boot-2.0.3之quartz集成,數據源問題,源碼探究》,作者關於quartz有3篇,都值得一看。
總結一下:mybatis不是必須的,springboot會自動將數據源注入到quartz(前提是你的配置正確)。本地化的job類也不是必須的,創建一個類主要是控制任務時傳參數。
理論上來說,在數據庫中建好quartz的表,在pom中加入相關依賴,配置好quartz的屬性,無需額外編碼,就可以讓quartz跑起來。只是這種情況沒有任何任務,需要對任務進行增刪改啟停就需要實現一個service來操作job,這個類網上的demo幾乎都一樣,實現控制job的方法都是調用quartz的方法。
要記錄的有幾點:
1、我還沒有徹底弄清job的各種特性,包括任務的調度等,先從基本功能開始,滿足業務需要即可。
2、踩了兩個坑,一個是依賴問題,在IDEA中可以順暢的跑,但部署到服務器運行就會報錯(mybatis相關)。琢磨了很久,沒找到原因,無意中發現可能是依賴沖突導致,於是從零開始,力求最少依賴方式,我的依賴見下。第二個坑,使用了企業自研的分布式數據庫(mysql),結果本機mysql正常,連企業數據庫就報錯:"Unknown column '0x' in 'field list'。最后dba查日志發現是在向trigger表插入數據時blob字段沒按要求將0x用引號包起來。
3、接下來還需要嘗試使用jar進行任務定制,實現不動框架就可以對job進行定制。
附pom及properties:
pom.xml,其中的mybatis是因為job要訪問業務數據庫才加入的依賴。
<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