Spring-Batch使用Spring-Cloud-Data-Flow进行资源管理,Job Repository元数据与业务数据隔离。
1、Spring-Cloud-Data-Flow(简写SCDF)
1.1、部署
1.2、效果
访问Dashboard页面http://ip:9393/dashboard
2、SpringBoot3+SpringBatch5+SpringCloudTask3
- pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-task</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
</dependency>
</dependencies>
- EnableBootBatchConfigure.java
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.task.configuration.DefaultTaskConfigurer;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.cloud.task.configuration.TaskConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.jdbc.support.JdbcTransactionManager;
import javax.sql.DataSource;
@EnableTask
@EnableBatchProcessing(
dataSourceRef = "repositoryDataSource",
transactionManagerRef = "repositoryTransactionManager",
tablePrefix = "boot3_batch_",//使用springboot3必须配置boot3前缀
maxVarCharLength = 1000)
@Slf4j
public class EnableBootBatchConfigure {
//配置spring-batch repository元数据数据源
@Bean("repositoryDataSource")
@ConditionalOnExpression("@environment.getProperty('spring.datasource.druid.batch-repository.url')!=null")
@ConfigurationProperties( prefix = "spring.datasource.druid.batch-repository" )
@ConditionalOnMissingBean(name="repositoryDataSource")
public DruidDataSource repositoryDataSource() {
DruidDataSource ds = new DruidDataSource();
log.info("spring batch repository datasource use [spring.datasource.druid.repository]");
return ds;
}
@Bean("repositoryTransactionManager")
public JdbcTransactionManager repositoryTransactionManager(@Qualifier( "repositoryDataSource" ) DruidDataSource dataSource ) {
log.info("pring batch repository datasource url:{},username:{}",dataSource.getUrl(),dataSource.getName());
return new JdbcTransactionManager( dataSource );
}
@Bean
public TaskConfigurer taskConfigurer(@Qualifier("repositoryDataSource") DataSource dataSource) {
//使用springboot3必须配置boot3前缀
return new DefaultTaskConfigurer(dataSource, "boot3_task_", null);
}
//配置业务默认数据源
@Bean
@Primary
public DataSource dataSource() {
return new DruidDataSourceWrapper();
}
@Bean("transactionManager")
@Primary
public JdbcTransactionManager masterTransactionManager(DataSource dataSource ) {
return new JdbcTransactionManager( dataSource );
}
}
- application.yaml
spring:
datasource:
druid:
#配置业务默认数据源,使用mybatis、jpa、mybatisplus均可
url: jdbc:mysql://127.0.0.1:3306/cloud-batch
username: 'busi'
password: 'pass'
max-active: 100
batch-repository: #配置springbatch元数据数据源(对应SCDF数据库,与第一步部署时配置的SCDF数据库信息保持一致)
url: jdbc:mysql://127.0.0.1:3306/dataflow
username: 'dataflow'
password: 'pass'
max-active: 10
cloud:
task:
schemaTarget: 'boot3'
tablePrefix: 'boot3_task_' #配置springboot3前缀
batch:
jdbc:
initialize-schema: never
3、 运行效果
启动Spring-Batch服务启动,SCDF Task executions效果如下
执行 Spring-Batch Job,SCDF Job executions效果如下