当JdbcJobInstanceDao
尝试调用FIND_JOBS_WITH_KEY
查询时,问题就出现了问题:
SELECT JOB_INSTANCE_ID, JOB_NAME from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?
%PREFIX%
令牌替换为application.properties
键spring.batch.table-prefix
的值,默认为"BATCH_"
。
我的小测试证明,应用程序属性肯定是从文件中加载的:
@ActiveProfiles("test") // to load `application-test.properties`
@RunWith(SpringRunner.class)
// we don't need a web context as we are playing with only server side classes
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = {TestDatabaseConfig.class,
MyBatchProperties.class, SpringBatchTestConfig.class})
@ComponentScan(basePackageClasses = {MyBatchConfig.class})
// MyBatchConfig has @EnableBatchProcessing and all job configurations.
public class BatchTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private ApplicationContext applicationContext;
@Before
public void setup() {
Environment environment = applicationContext.getEnvironment();
System.out.println(environment.getProperty("spring.batch.table-prefix"));
// above prints MY_SCEHMA_USER.BATCH_ as expected
}
@Test
public void checkJobRuns() {
try {
jobLauncherTestUtils.launchJob();
} catch (Exception e) {
e.printStackTrace(); // <-- fails here with the query returning "table not found" because the prefix was not configured correctly.
}
}
}
application-test.properties :
spring.batch.table-prefix=MY_SCHEMA_USER.BATCH_
我长时间使用自定义配置进行作业运行,但JobLauncherTestUtils
似乎并不尊重这些配置属性。
我需要不同的表前缀,因为批处理数据库表由与连接的数据库用户不同的架构拥有。 (即
MY_APP_USER
尝试访问MY_SCHEMA_USER.BATCH_JOB_INSTANCE
)。对表的非限定引用尝试(和失败)来解析针对MY_APP_USER
而不是MY_SCHEMA_USER
的批处理表。
我尝试创建JobRepositoryFactoryBean
bean并使用@ConfigurationProperties("spring.batch")
对其进行注释。然而 - 随着这一点无论如何 - 我不明白为什么我应该这样配置这些而不是属性。
如何使用JobLauncherTestUtils在junit测试中使用应用程序属性正确配置与Batch相关的bean?
答案 0 :(得分:0)
问题是因为我在BatchConfigurer
类中创建了自己的MyBatchConfig
bean。
BatchConfigurer使用Batch框架的每个组件(jobRepository,daos等)注册配置属性
这意味着未通过@Component
带注释的DefaultBatchConfigurer
类填充属性。至于为什么我决定将这段代码放在这里,即使我 - 作者 - 我也不确定。我想我不需要在最小的睡眠后编码。
感谢您放纵我的愚蠢!