Springboot+Quartz+druid+多庫


  很久以前就用過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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM