Parameters 如何在Spring批处理中发送自定义对象作为作业参数?

Parameters 如何在Spring批处理中发送自定义对象作为作业参数?,parameters,spring-batch,jobs,custom-object,Parameters,Spring Batch,Jobs,Custom Object,我需要向Spring批处理作业发送一个自定义对象,在该批处理作业中,项目处理器将持续使用该对象来满足业务需求 如何将自定义对象从外部发送到作业上下文。此对象在不同的作业之间变化,并根据业务案例在运行时生成 如何将其作为作业参数发送?或者是否有任何方法可以将此对象设置为相应的作业 重写SpringJobParameter可以在任何方面帮助我吗?或者说,这种压倒一切的行为会导致什么大问题?这个问题已经在官方的Spring Batch论坛上提出: Jira当时是开放的,但开发人员选择不解决它(不会修复

我需要向Spring批处理作业发送一个自定义对象,在该批处理作业中,项目处理器将持续使用该对象来满足业务需求

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

如何将其作为作业参数发送?或者是否有任何方法可以将此对象设置为相应的作业


重写SpringJobParameter可以在任何方面帮助我吗?或者说,这种压倒一切的行为会导致什么大问题?

这个问题已经在官方的Spring Batch论坛上提出:

Jira当时是开放的,但开发人员选择不解决它(
不会修复它):

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



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

我在此总结了您无法将对象作为
JobParameter
发送的原因。在这个问题上有两个想法,你可以怎样做


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

在初始化作业执行之前,您将使用ThreadLocal,这里有一个关于如何使用ThreadLocal的西班牙语教程:


我找到了一种方法,只要字符串参数长度是固定的,但大于250。只需将其拆分为250个部分,然后在XML配置中以以下方式使用Spring EL:

在主类中设置参数,如下所示:

JobParametersBuilder parametersBuilder = new JobParametersBuilder();
parametersBuilder.addString("useful.parameter.1", headers.substring(0, 250));
parametersBuilder.addString("useful.parameter.2", headers.substring(250, 500));
parametersBuilder.addString("useful.parameter.3", headers.substring(500, headers.length()));
在“步骤”中配置参数和范围:



希望有帮助。

使用下面的类发送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;
        }
    }
公共静态类CustomJobParameter扩展了JobParameter{
私人T customParam;
公共CustomJobParameter(T customParam){
super(UUID.randomuid().toString());//这是为了避免重复的JobInstance错误
this.customParam=customParam;
}
公共T getValue(){
返回customParam;
}
}
===========================

用法:
  • 发送参数:

    JobParameters-paramJobParameters=new-JobParameters-builder().addParameter(“customparam”,new-CustomJobParameter(myClassReference)).toJobParameters()

  • 检索参数:

    MyClass MyClass=(MyClass)jobExecution.getJobParameters().getParameters().get(“customparam”).getValue()


  • 是否有任何东西可以阻止这个对象成为一个bean(或容器bean),您可以将它连接到处理器?@DBK。是的,它是一个从数据库读取的实体。对于每个作业,我必须根据功能需要使用不同的实体。对我来说,最简单的方法是将对象序列化为Json并将其放入字符串作业参数。感谢bozic的回复。我已经用Json实现了系列化。我正在寻找任何其他我感兴趣的选项。无论如何,谢谢您的回复
    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;
            }
        }