You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 6中Spring Batch无数据库依赖实现方案咨询

无数据库依赖的Spring 6 Spring Batch Job Repository解决方案

方案一:自定义内存版Job Repository实现

既然官方移除了Map-based实现,你可以自己基于线程安全的内存集合实现一套符合Spring Batch要求的Job Repository组件,核心是实现JobRepository、JobExecutionDao、StepExecutionDao和ExecutionContextDao这几个接口,用ConcurrentHashMap存储作业执行数据,保证多线程场景下的安全性。

核心代码示例

先实现JobExecutionDao:

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.repository.dao.JobExecutionDao;
import org.springframework.batch.core.repository.dao.NoSuchObjectException;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;

public class InMemoryJobExecutionDao implements JobExecutionDao {
    private final ConcurrentMap<Long, JobExecution> jobExecutions = new ConcurrentHashMap<>();
    private final AtomicLong idGenerator = new AtomicLong(1);

    @Override
    public void saveJobExecution(JobExecution jobExecution) {
        if (jobExecution.getId() == null) {
            jobExecution.setId(idGenerator.getAndIncrement());
        }
        jobExecutions.put(jobExecution.getId(), jobExecution);
    }

    @Override
    public void updateJobExecution(JobExecution jobExecution) {
        if (!jobExecutions.containsKey(jobExecution.getId())) {
            throw new NoSuchObjectException("JobExecution not found: " + jobExecution.getId());
        }
        jobExecutions.put(jobExecution.getId(), jobExecution);
    }

    @Override
    public JobExecution getJobExecution(Long executionId) {
        JobExecution execution = jobExecutions.get(executionId);
        if (execution == null) {
            throw new NoSuchObjectException("JobExecution not found: " + executionId);
        }
        return execution;
    }

    // 其他接口方法按需实现(如findJobExecutions、getLastJobExecution等)
}

接着实现StepExecutionDao、JobInstanceDao、ExecutionContextDao的内存版本,逻辑类似,均用ConcurrentHashMap存储对应实体。最后配置自定义JobRepository:

import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.SimpleJobRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
public class InMemoryBatchConfig {

    @Bean
    public JobRepository jobRepository(PlatformTransactionManager transactionManager) {
        return new SimpleJobRepository(
                new InMemoryJobExecutionDao(),
                new InMemoryStepExecutionDao(),
                new InMemoryJobInstanceDao(),
                new InMemoryExecutionContextDao()
        );
    }
}

方案二:禁用作业状态跟踪(限无状态批处理场景)

如果你的批处理作业不需要跟踪执行状态(比如一次性运行、无需重试/恢复的简单任务),可以通过调整配置,让Spring Batch跳过状态持久化。不过这种方式仅适用于不需要作业历史、失败重试的场景:

配置示例

import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.context.annotation.Configuration;

@Configuration
public class NoTrackingBatchConfig extends DefaultBatchConfigurer {

    @Override
    protected JobRepository createJobRepository() throws Exception {
        return new JobRepository() {
            @Override
            public JobExecution createJobExecution(String jobName) {
                return new JobExecution(new JobInstance(1L, jobName));
            }

            // 其余接口方法按需空实现或返回默认值,比如save/update方法直接返回不做操作
        };
    }
}

注意事项

  • 内存版实现不支持应用重启后的状态恢复,所有作业执行数据会在应用关闭后丢失;
  • 仅支持单实例运行,不适合集群部署场景;
  • 如果作业需要重试、暂停恢复或者需要保留执行历史,这种方案不适用,只能接受官方推荐的嵌入式数据库方案。

内容的提问来源于stack exchange,提问作者Rishabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:52:45