Springboot+Quartz+druid+多庫

  好久之前就用過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
相關文章
相關標籤/搜索