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

如何将User实体传入Spring Batch任务并在Job中使用?

实现方案

步骤1:触发任务时将用户ID传入JobParameters

修改定时触发方法,把获取到的用户ID添加到JobParameters中——这是Spring Batch传递参数到Job/Step/Tasklet的标准方式:

@Scheduled(cron = "30 * * * * *")
fun batchGo(){
    val user = userRepository.findByIdOrNull(1) ?: throw Exception("user not found")

    val jobParameters = JobParametersBuilder()
        .addLong("userId", user.id) // 将用户ID加入Job参数
        .toJobParameters()

    val jobExecution: JobExecution = jobLauncher.run(batchConfig.myJob(), jobParameters)
    if (jobExecution.status == BatchStatus.COMPLETED) {
        println("batch success")
    } else {
        println("batch failed")
    }
}

步骤2:在StepScope的Tasklet中读取用户ID

由于myTask已经标注了@StepScope,可以通过两种方式获取传入的用户ID:

方式一:通过ChunkContext获取

@Bean
@StepScope
fun myTask(): Tasklet {
    return Tasklet { _, chunkContext ->
        val userId = chunkContext.stepExecution.jobParameters.getLong("userId")
        log.info { "test job, userId: $userId" }
        RepeatStatus.FINISHED
    }
}

方式二:直接注入Job参数

@Bean
@StepScope
fun myTask(@Value("#{jobParameters['userId']}") userId: Long): Tasklet {
    return Tasklet { _, _ ->
        log.info { "test job, userId: $userId" }
        RepeatStatus.FINISHED
    }
}

关键说明

  • @StepScope注解保证Tasklet在每次Step执行时重新实例化,确保能获取到当前Job的最新参数。
  • Job参数的类型要匹配:如果用户ID是String类型,改用addString方法添加参数。
  • 注意参数名称的一致性,确保添加和读取的参数名(如userId)完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:29