【问题标题】:How can I pass a collection as Spring Batch JobParameter?如何将集合作为 Spring Batch JobParameter 传递?
【发布时间】:2021-02-26 14:56:27
【问题描述】:

我想将 String 的集合作为 step 参数传递。 由于我没有找到构造JobParameter 用于收集的方法,因此我决定将其作为带有逗号分隔值的字符串传递。

我执行作业的代码:

@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob;

public void execute() {
    List<String> myCollection = getMyCollection();
    
    jobLauncher.run(myJob, new JobParameters(ImmutableMap.<String, JobParameter> builder()
            .put("myCollection", new JobParameter(String.join(",", myCollection)))
            .build())
    ...
}

我将 Step 定义如下:

@Bean
@StepScope
public Step myStep(@Value("#{jobParameters['myCollection']}") String myCollectionString) {
    List<String> myCollection = ArrayUtil.asList(lisReferencesString.split(","));
    ...
}

但是当开始执行时我得到了错误:

org.postgresql.util.PSQLException: ERROR: value too long for type character varying(250)

由于作业参数存储为列值,因此我不能将太长的字符串作为参数传递。

您能建议我如何克服它吗?

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    我认为您无法将集合作为作业参数传递。你应该可以

    1. 将字符串拆分为每个 250 个字符,并在多个参数中发送它们
    2. 将参数保存在临时表或文件中的某处,并在需要时在作业中读取。

    请查看这些帖子
    how to send a custom object as Job Parameter in Spring Batch?
    ArrayList cannot be cast to org.springframework.batch.core.JobParameter

    【讨论】:

      【解决方案2】:

      String 类型的作业参数的默认长度为 250,请参阅BATCH_JOB_EXECUTION_PARAMS。 Spring Batch 提供的脚本只是一个起点,您可以根据需要对其进行更新。因此,在您的情况下,您需要根据需要增加BATCH_JOB_EXECUTION_PARAMS#STRING_VAL 的长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 2012-07-07
        • 1970-01-01
        • 2013-03-24
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多