如何创建基于Hazelcast的DataSource适配Spring Batch
问题分析与解决方案
你之前的思路存在核心误区:Hazelcast并非关系型数据库,没有对应的JDBC Driver,无法通过DriverDataSource创建指向它的JDBC数据源。Spring Batch默认的作业元数据存储依赖JDBC,但要改用Hazelcast作为持久层,需要基于Hazelcast的分布式Map(IMap)实现自定义的作业元数据访问层,而非硬套JDBC模式。
核心修正方向
- 移除无用的JDBC DataSource配置,改用Hazelcast IMap存储Spring Batch的作业元数据(JobInstance、JobExecution、StepExecution、ExecutionContext等)
- 使用Spring Batch提供的
MapJobRepositoryFactoryBean生成基于Map的JobRepository,替换内部默认的本地Map为Hazelcast分布式IMap - 适配JobExplorer,使用基于Hazelcast IMap的Dao实现
完整配置示例
@Configuration public class HazelcastBatchConfig { // 配置Hazelcast客户端实例 @Bean public HazelcastInstance hazelcastInstance() { ClientConfig config = new ClientConfig(); config.setClusterName("dev"); return HazelcastClient.newHazelcastClient(config); } // 定义存储作业元数据的Hazelcast分布式Map @Bean public IMap<Long, JobInstance> jobInstanceMap(HazelcastInstance hazelcastInstance) { return hazelcastInstance.getMap("spring-batch-job-instances"); } @Bean public IMap<Long, JobExecution> jobExecutionMap(HazelcastInstance hazelcastInstance) { return hazelcastInstance.getMap("spring-batch-job-executions"); } @Bean public IMap<Long, StepExecution> stepExecutionMap(HazelcastInstance hazelcastInstance) { return hazelcastInstance.getMap("spring-batch-step-executions"); } @Bean public IMap<Long, ExecutionContext> jobExecutionContextMap(HazelcastInstance hazelcastInstance) { return hazelcastInstance.getMap("spring-batch-job-execution-contexts"); } @Bean public IMap<Long, ExecutionContext> stepExecutionContextMap(HazelcastInstance hazelcastInstance) { return hazelcastInstance.getMap("spring-batch-step-execution-contexts"); } // 配置Hazelcast事务管理器 @Bean public HazelcastTransactionManager hazelcastTransactionManager(HazelcastInstance hazelcastInstance) { return new HazelcastTransactionManager(hazelcastInstance); } // 基于Hazelcast IMap创建JobRepository @SneakyThrows @Bean public JobRepository hazelcastJobRepository(HazelcastTransactionManager transactionManager, IMap<Long, JobInstance> jobInstanceMap, IMap<Long, JobExecution> jobExecutionMap, IMap<Long, StepExecution> stepExecutionMap, IMap<Long, ExecutionContext> jobExecutionContextMap, IMap<Long, ExecutionContext> stepExecutionContextMap) { MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(); factoryBean.setTransactionManager(transactionManager); // 替换本地Map为Hazelcast分布式IMap factoryBean.setJobInstanceMap(jobInstanceMap); factoryBean.setJobExecutionMap(jobExecutionMap); factoryBean.setStepExecutionMap(stepExecutionMap); factoryBean.setJobExecutionContextMap(jobExecutionContextMap); factoryBean.setStepExecutionContextMap(stepExecutionContextMap); return factoryBean.getObject(); } // 配置JobBuilderFactory @Bean public JobBuilderFactory jobBuilderFactory(JobRepository hazelcastJobRepository){ return new JobBuilderFactory(hazelcastJobRepository); } // 配置StepBuilderFactory @Bean public StepBuilderFactory stepBuilderFactory(JobRepository hazelcastJobRepository, HazelcastTransactionManager transactionManager){ return new StepBuilderFactory(hazelcastJobRepository, transactionManager); } // 基于Hazelcast IMap创建JobExplorer @Bean public JobExplorer jobExplorer(IMap<Long, JobInstance> jobInstanceMap, IMap<Long, JobExecution> jobExecutionMap, IMap<Long, StepExecution> stepExecutionMap, IMap<Long, ExecutionContext> jobExecutionContextMap, IMap<Long, ExecutionContext> stepExecutionContextMap) { // 使用适配Hazelcast的Dao实现 JobInstanceDao jobInstanceDao = new MapJobInstanceDao(jobInstanceMap); JobExecutionDao jobExecutionDao = new MapJobExecutionDao(jobExecutionMap, jobExecutionContextMap); StepExecutionDao stepExecutionDao = new MapStepExecutionDao(stepExecutionMap, stepExecutionContextMap); ExecutionContextDao executionContextDao = new MapExecutionContextDao(jobExecutionContextMap, stepExecutionContextMap); return new SimpleJobExplorer(jobInstanceDao, jobExecutionDao, stepExecutionDao, executionContextDao); } @Bean public ListableJobLocator listableJobLocator(){ return new MapJobRegistry(); } }
关键注意事项
- 集群一致性:Hazelcast的IMap会自动在集群内同步作业元数据,适合分布式Spring Batch部署场景
- 数据持久化:如果需要重启集群后保留作业元数据,需为Hazelcast配置持久化存储(如磁盘、数据库)
- 事务支持:
HazelcastTransactionManager会管理IMap的事务操作,确保作业元数据的一致性 - 移除冗余配置:完全删除原有的JDBC DataSource相关代码,避免Spring Batch自动启用JDBC模式
内容的提问来源于stack exchange,提问作者Jacob Goldverg
相关产品推荐
相关产品推荐

