我正在尝试设置一个ResourcelessTransactionManager使用Java配置使用事务管理器的Spring Boot批处理项目,但是我没有运气。
ResourcelessTransactionManager
我尝试执行此操作的原因是我不希望任何状态持续存在,并且如果我不希望hsqldb以其开头,则我不希望浪费其内存。我有一个现有的Spring Batch项目,它不使用Spring Boot,并且没有持久性,也没有hsqldb。
我使用此示例项目作为基础(但删除了hsqldb),并以其他答案作为参考,但我不断收到此异常:
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 Boot属性。通过查看驱动程序类,启动可以推断您的数据库类型并可以自动创建DataSourcebean。
DataSource
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缺少明确的信息,并且在classpath中没有提供内存数据库。
通过在application.properties中显式提供条目或在类路径中包含内存db(H2,HSQL等)来解决问题。
只要不使用任何数据源(例如,如果已配置ResourcelessTransactionManager&MapJobRepository),您的配置就可以了,只要您不使用它,EnableAutoConfiguration但是堆栈跟踪指示使用Boot with即可EnableAutoConfiguration。
MapJobRepository
EnableAutoConfiguration
编辑: 我能够通过添加来修复您的代码中的错误@SpringBootApplication(exclude={DataSource.class,DataSourceAutoConfiguration.class})
@SpringBootApplication(exclude={DataSource.class,DataSourceAutoConfiguration.class})
日志转储了这一点-在bean创建过程之后,
org.apache.tomcat.jdbc.pool.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration