天天看点

Spring Cloud Task 配置DataSource

文章目录

    • Spring Cloud Task 配置DataSource
    • 源代码

Spring Cloud Task 配置DataSource

Spring Cloud Task使用一个数据源来存储task执行的结果。默认情况下,提供一个内存中的H2实例来作为数据源。但是,在生产环境中,还是需要配置自己的数据源。如果只使用一个DataSource,并且该DataSourc同时用为业务数据存储和task执行结果的存储,那么所需要做的就是提供任何DataSource,比如MySQL。最简单的方法是通过Spring Boot的配置约定。

本篇博文就使用mysql来存储task的执行结果,下面来看看具体的配置和代码。

关于代码我们还是使用之前一样的代码:

package com.example;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.cloud.task.listener.annotation.AfterTask;
import org.springframework.cloud.task.listener.annotation.BeforeTask;
import org.springframework.cloud.task.listener.annotation.FailedTask;
import org.springframework.cloud.task.repository.TaskExecution;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableTask
public class HelloWorldApplication {


    @Bean
    public CommandLineRunner commandLineRunner() {
        return new MyCommonLineRunner();
    }

    @BeforeTask
    public void beforeTask(TaskExecution taskExecution){
        System.out.println("task start.." + taskExecution.toString());
    }


    @AfterTask
    public void afterTask(TaskExecution taskExecution){
        System.out.println("task end.." + taskExecution.toString());
    }


    @FailedTask
    public void failedTask(TaskExecution taskExecution){
        System.out.println("task fail.." + taskExecution.toString());
    }

    public static class MyCommonLineRunner implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
            System.out.println("Hello, World");
        }
    }

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

           

然后我们需要加上maven的依赖:

<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.21</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
           

还有加上配置,然后还有docker安装好mysql,然后创建一个database,命名为testdb

# 将Spring Cloud Task的日志记录设置为DEBUG, 可以更方便的让我们调试应用
logging.level.org.springframework.cloud.task=DEBUG
# 设置application name (会转为task name)
spring.application.name=HelloWorld


# docker pull mysql
# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://192.168.99.100:3306/testdb?useUnicode=true&character_set_server=utf8mb4&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username = root
spring.datasource.password = root
           

然后我们运行项目

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v2.4.0-SNAPSHOT)

2020-07-18 22:23:50.800  INFO 15012 --- [           main] com.example.HelloWorldApplication        : Starting HelloWorldApplication using Java 1.8.0_92 on C with PID 15012 (C:\Users\c\Desktop\spring-cloud-task-demo\target\classes started by c in C:\Users\c\Desktop\spring-cloud-task-demo)
2020-07-18 22:23:50.803  INFO 15012 --- [           main] com.example.HelloWorldApplication        : No active profile set, falling back to default profiles: default
2020-07-18 22:23:51.338  INFO 15012 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
2020-07-18 22:23:51.357  INFO 15012 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 0 JPA repository interfaces.
2020-07-18 22:23:51.915  INFO 15012 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-07-18 22:23:51.926  INFO 15012 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-07-18 22:23:52.064  INFO 15012 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-07-18 22:23:52.126  INFO 15012 --- [         task-1] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-07-18 22:23:52.146 DEBUG 15012 --- [           main] o.s.c.t.c.SimpleTaskAutoConfiguration    : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2020-07-18 22:23:52.147 DEBUG 15012 --- [           main] o.s.c.t.c.DefaultTaskConfigurer          : EntityManager was found, using JpaTransactionManager
2020-07-18 22:23:52.199  INFO 15012 --- [         task-1] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.18.Final
2020-07-18 22:23:52.417  INFO 15012 --- [         task-1] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-07-18 22:23:52.496 DEBUG 15012 --- [           main] o.s.c.t.r.s.TaskRepositoryInitializer    : Initializing task schema for mysql database
2020-07-18 22:23:52.654  INFO 15012 --- [         task-1] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
2020-07-18 22:23:52.917  INFO 15012 --- [         task-1] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-07-18 22:23:52.935  INFO 15012 --- [         task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-07-18 22:23:53.048 DEBUG 15012 --- [           main] o.s.c.t.r.support.SimpleTaskRepository   : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='HelloWorld', startTime=Sat Jul 18 22:23:52 GMT+08:00 2020, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
task start..TaskExecution{executionId=1, parentExecutionId=null, exitCode=null, taskName='HelloWorld', startTime=Sat Jul 18 22:23:52 GMT+08:00 2020, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2020-07-18 22:23:53.073  INFO 15012 --- [           main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories…
2020-07-18 22:23:53.073  INFO 15012 --- [           main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-07-18 22:23:53.081  INFO 15012 --- [           main] com.example.HelloWorldApplication        : Started HelloWorldApplication in 2.701 seconds (JVM running for 5.796)
Hello, World
task end..TaskExecution{executionId=1, parentExecutionId=null, exitCode=0, taskName='HelloWorld', startTime=Sat Jul 18 22:23:52 GMT+08:00 2020, endTime=Sat Jul 18 22:23:53 GMT+08:00 2020, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2020-07-18 22:23:53.098 DEBUG 15012 --- [           main] o.s.c.t.r.support.SimpleTaskRepository   : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=Sat Jul 18 22:23:53 GMT+08:00 2020, exitMessage='null', errorMessage='null'}
2020-07-18 22:24:52.941  INFO 15012 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-07-18 22:24:52.944  INFO 15012 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2020-07-18 22:24:52.944  INFO 15012 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-07-18 22:24:52.950  INFO 15012 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Process finished with exit code 0


           

从日志输出来看,我们已经使用了MySQL作为我们的数据源了。

然后我们查看我们的tables

可以看到自动创建了下面这些表

Spring Cloud Task 配置DataSource

然后我们可以查看task的执行结果记录。

Spring Cloud Task 配置DataSource

源代码

https://gitee.com/cckevincyh/Spring-Cloud-Task/tree/task-datasource

继续阅读