1. 程式人生 > >Springboot quartz叢集(1) — 專案跑起來

Springboot quartz叢集(1) — 專案跑起來

  • 開發工具:
    1. IDEA 2017.1.5
    2. Maven專案管理

1. 新建springboot模組

  • 模組名稱:cnlm-springboot-quartz
    專案結構

2. 重新命名springboot啟動類為Application

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 執行:果然預料之中,執行不起來,報錯,異常資訊:

2017-07-15 21:31:38.178  WARN 5320 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class
]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.tomcat.jdbc.pool.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class
for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active). 2017-07-15 21:31:38.182 INFO 5320 --- [ main] utoConfigurationReportLoggingInitializer : Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. Disconnected from the target VM, address: '127.0.0.1:43215', transport: 'socket' 2017-07-15 21:31:38.187 ERROR 5320 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Cannot determine embedded database driver class for database type NONE Action: If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active). Process finished with exit code 1

初步判斷是由於沒有設定資料來源導致,
resources/application.properties檔案加入資料庫連線配置:

## master 資料來源配置
master.datasource.url=jdbc:mysql://localhost:3306/cnlm-blog?useUnicode=true&characterEncoding=utf8
master.datasource.username=root
master.datasource.password=123456
master.datasource.driverClassName=com.mysql.cj.jdbc.Driver
server.port=22222
# 配置mapper的掃描,找到所有的mapper.xml對映檔案
mybatis.mapperLocations=classpath:mapper/**/*.xml
# 載入全域性的配置檔案
mybatis.configLocation=classpath:mybatis-config.xml

pom.xml檔案中加入mysql資料庫java版驅動依賴

<!-- MySql資料庫驅動 版本號6.0.6 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-connector-java.version}</version>
</dependency>

pom.xml檔案中加入阿里巴巴開源資料庫框架druid的依賴

<!-- druid阿里巴巴資料庫連線池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>

至此,建立一個類用於初始化資料庫連線

package me.cnlm.springboot.quartz.datasource;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @author [email protected]
 * @time 2017/5/4
 */
@Configuration
// 掃描 Mapper 介面並容器管理
@MapperScan(basePackages = {MasterDataSourceConfig.PACKAGE_DAO}, sqlSessionFactoryRef = "masterSqlSessionFactory")

public class MasterDataSourceConfig {

    static final String PACKAGE_DAO = "me.cnlm.springboot.quartz.dao";

    @Value("${mybatis.mapperLocations}")
    private String mapperLocation;

    @Value("${mybatis.configLocation}")
    private String configLocation;

    @Value("${master.datasource.url}")
    private String url;

    @Value("${master.datasource.username}")
    private String user;

    @Value("${master.datasource.password}")
    private String password;

    @Value("${master.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(mapperLocation));

        return sessionFactory.getObject();
    }
}

4. 再次執行,還是驚嚇!!!

這次異常:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'masterSqlSessionFactory' threw exception; nested exception is java.io.FileNotFoundException: class path resource [mapper/] cannot be resolved to URL because it does not exist
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
    ... 17 common frames omitted
Caused by: java.io.FileNotFoundException: class path resource [mapper/] cannot be resolved to URL because it does not exist

….
….
….
期間還需要新增相關依賴,最後在執行的時候已經習慣了,還是異常:

Unregistering JMX-exposed beans on shutdown

網上一搜,答案一大堆,原來是沒有引入嵌入式tomcat,springboot預設的嵌入容器是tomcat,也可以自定義使用jetty,網上很多答案是加的:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

但我加的是下面這個,它包括了上面的tomcat依賴

<!-- Spring Boot Web 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

5. 再次啟動,這次終於成功執行起來了。另外需要說明的是,上述我引入了mybatis的額外配置檔案以及mybatis寫sql的xml掃描路徑,所以需要新增

  • resources/mybatis
  • resources/mybatis-config.xml
歡迎加入技術交流QQ群566654343