Spring 启动批处理 ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException
Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException
我正在尝试设置一个 spring 启动批处理项目,该项目使用 ResourcelessTransactionManager
事务管理器,使用 Java 配置,但我没有运气。
我尝试这样做的原因是我不希望任何状态持续存在,如果我不希望 hsqldb 开始,我宁愿不要浪费内存。我有一个现有的 Spring 批处理项目,它没有使用 Spring 引导,并且它在没有持久性且没有 hsqldb 的情况下工作。
我正在使用此 sample project as the base (but with hsqldb removed), and this other answer 作为参考,但我一直收到此异常:
Caused by: 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).
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:218) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:42) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat.dataSource(DataSourceConfiguration.java:55) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_73]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_73]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 56 common frames omitted
这是我修改的:
@SpringBootApplication
@EnableBatchProcessing
@Configuration
public class SampleBatchApplication {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
protected Tasklet tasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext context) {
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Job job() throws Exception {
return this.jobs.get("job").start(step1()).build();
}
@Bean
protected Step step1() throws Exception {
return this.steps.get("step1").tasklet(tasklet()).build();
}
public static void main(String[] args) throws Exception {
// System.exit is common for Batch applications since the exit code can be used to
// drive a workflow
System.exit(SpringApplication
.exit(SpringApplication.run(SampleBatchApplication.class, args)));
}
@Bean
ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobRepository getJobRepo() throws Exception {
return new MapJobRepositoryFactoryBean(transactionManager()).getObject();
}
}
我需要做什么才能让它使用 ResourcelessTransactionManager
?
编辑:更清楚地说明了我希望 ResourcelessTransactionManager 工作的原因。
您的问题似乎是您的配置中没有可用的数据源。 Spring 批处理需要数据库以保持其状态。
Spring 如果类路径上有一些,引导可以在内存数据库中自动配置。您所指的示例应用程序在此处的 POM 中包含 HSQL:https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-samples/spring-boot-sample-batch/pom.xml#L26
因此,要解决您的问题,请定义对数据库的访问。
下面是一些用于设置数据源的基本 spring 启动属性。通过查看驱动程序 class ,引导可以推断您的数据库类型并可以自动创建 DataSource
bean。
spring.datasource.driver-class-name
spring.datasource.url
spring.datasource.username
spring.datasource.password
spring.datasource.tomcat.max-active
spring.datasource.tomcat.initialSize
spring.datasource.tomcat.maxIdle
最后三个属性用于在容器中设置连接池。
显式 DataSource
信息缺失,class 路径中未提供内存数据库。
通过在 application.properties 中明确提供条目或在 class 路径中包含内存数据库(H2、HSQL 等)来解决问题。
你的配置看起来没有使用任何数据源(即如果你配置了 ResourcelessTransactionManager
& MapJobRepository
)只要你不使用 EnableAutoConfiguration
但你的堆栈跟踪表示 Boot with EnableAutoConfiguration
的用法。
我猜,选择性禁用数据源是不允许的,see question
编辑: 我可以通过添加 @SpringBootApplication(exclude={DataSource.class,DataSourceAutoConfiguration.class})
来修复您代码中的错误
日志转储这个 - 在 bean 创建过程之后,
排除:
org.apache.tomcat.jdbc.pool.DataSource
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
我正在尝试设置一个 spring 启动批处理项目,该项目使用 ResourcelessTransactionManager
事务管理器,使用 Java 配置,但我没有运气。
我尝试这样做的原因是我不希望任何状态持续存在,如果我不希望 hsqldb 开始,我宁愿不要浪费内存。我有一个现有的 Spring 批处理项目,它没有使用 Spring 引导,并且它在没有持久性且没有 hsqldb 的情况下工作。
我正在使用此 sample project as the base (but with hsqldb removed), and this other answer 作为参考,但我一直收到此异常:
Caused by: 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).
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:218) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:42) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat.dataSource(DataSourceConfiguration.java:55) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_73]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_73]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 56 common frames omitted
这是我修改的:
@SpringBootApplication
@EnableBatchProcessing
@Configuration
public class SampleBatchApplication {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
protected Tasklet tasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext context) {
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Job job() throws Exception {
return this.jobs.get("job").start(step1()).build();
}
@Bean
protected Step step1() throws Exception {
return this.steps.get("step1").tasklet(tasklet()).build();
}
public static void main(String[] args) throws Exception {
// System.exit is common for Batch applications since the exit code can be used to
// drive a workflow
System.exit(SpringApplication
.exit(SpringApplication.run(SampleBatchApplication.class, args)));
}
@Bean
ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobRepository getJobRepo() throws Exception {
return new MapJobRepositoryFactoryBean(transactionManager()).getObject();
}
}
我需要做什么才能让它使用 ResourcelessTransactionManager
?
编辑:更清楚地说明了我希望 ResourcelessTransactionManager 工作的原因。
您的问题似乎是您的配置中没有可用的数据源。 Spring 批处理需要数据库以保持其状态。
Spring 如果类路径上有一些,引导可以在内存数据库中自动配置。您所指的示例应用程序在此处的 POM 中包含 HSQL:https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-samples/spring-boot-sample-batch/pom.xml#L26
因此,要解决您的问题,请定义对数据库的访问。
下面是一些用于设置数据源的基本 spring 启动属性。通过查看驱动程序 class ,引导可以推断您的数据库类型并可以自动创建 DataSource
bean。
spring.datasource.driver-class-name
spring.datasource.url
spring.datasource.username
spring.datasource.password
spring.datasource.tomcat.max-active
spring.datasource.tomcat.initialSize
spring.datasource.tomcat.maxIdle
最后三个属性用于在容器中设置连接池。
显式 DataSource
信息缺失,class 路径中未提供内存数据库。
通过在 application.properties 中明确提供条目或在 class 路径中包含内存数据库(H2、HSQL 等)来解决问题。
你的配置看起来没有使用任何数据源(即如果你配置了 ResourcelessTransactionManager
& MapJobRepository
)只要你不使用 EnableAutoConfiguration
但你的堆栈跟踪表示 Boot with EnableAutoConfiguration
的用法。
我猜,选择性禁用数据源是不允许的,see question
编辑: 我可以通过添加 @SpringBootApplication(exclude={DataSource.class,DataSourceAutoConfiguration.class})
日志转储这个 - 在 bean 创建过程之后,
排除:
org.apache.tomcat.jdbc.pool.DataSource
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration