如何在Spring Batch中发送自定义对象作为Job参数?

rav*_*ddy 5 parameters jobs custom-object spring-batch

我需要向Spring Batch Job发送一个自定义对象,该对象由项目处理器连续用于业务需求。

我们如何将自定义对象从外部发送到作业上下文。该对象在Job之间变化,并在运行时根据业务案例生成。

如何将其作为作业参数发送?还是有什么办法可以将此对象设置为相应的Job?

可以覆盖Spring JobParameter以任何方式对我有帮助吗?还是这种压倒性行为会导致任何大问题?

man*_*noj 7

使用以下类发送 CustomObject。

public static class CustomJobParameter<T extends Serializable> extends JobParameter {
        private T customParam;
        public CustomJobParameter(T customParam){
            super(UUID.randomUUID().toString());//This is to avoid duplicate JobInstance error
            this.customParam = customParam;
        }
        public T getValue(){
            return customParam;
        }
    }
Run Code Online (Sandbox Code Playgroud)

============================

用法:

  1. 发送参数:

    JobParameters paramJobParameters = new JobParametersBuilder().addParameter("customparam", new CustomJobParameter<MyClass>(myClassReference)).toJobParameters();

  2. 检索参数:

    MyClass myclass = (MyClass)jobExecution.getJobParameters().getParameters().get("customparam").getValue();


Thr*_*rax 6

这个问题已在官方 Spring Batch 论坛上提出:http://forum.spring.io/forum/spring-projects/batch/96660-how-to-pass-complex-objects-to-job-launcher

当时有一个 Jira 是开放的,但开发人员选择不解决它(Won't fix): https: //jira.spring.io/browse/BATCH-966

这里讨论了或多或少相同情况的替代解决方案(将流作为 JobParameter 传递):将流作为参数传递给作业


总而言之,答案是否定的,您只能将原始类型作为 JobParameters 传递,并且不鼓励重写它。替代解决方案是使用参数声明并注入 Bean,或者使用静态变量在项目范围内访问它。


Nen*_*zic 6

JobParameter我总结了您无法像这个问题一样发送对象的原因。关于如何做到这一点,有几个想法。

TL:TR:我认为最好的方法是在数据库中创建存储对象的表并将该记录的 id 作为 JobParameter 传递,或者将对象序列化为 json 并将其作为作业中的 String 作为 JobParameter 传递。如果您选择第二个选项,请注意 string_val 在数据库中存储为 varchar 250,因此限制为 250 个字符。