2015-11-17 36 views
1

我有一个自定义对象发送到Spring批处理作业的需求,其中此对象被项目处理器连续用于业务需求。如何在Spring Batch中将自定义对象作为作业参数发送?

我们如何从外部发送自定义对象到作业上下文。此对象从作业更改为作业,并根据业务案例在运行时生成。

如何发送此作为工作参数?或者有什么方法可以将此对象设置为相应的作业?

可以重写Spring JobParameter以任何方式帮助我吗?或者是否有任何重大问题作为此重写行为的结果?

+1

有什么阻止这个对象被一个bean(或容器中的豆),你可以只电线插入你的处理器? – DBK

+0

@DBK。,它是从数据库中读取的实体。并且对于每项工作,我必须根据功能需要使用不同的实体。 –

+0

对我来说,最简单的方法是将Object序列化到Json,并将它放到String作业参数 –

回答

2

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

一个吉拉是开着的,然后但developpers选择不解决它(Won't fix):https://jira.spring.io/browse/BATCH-966

一个替代的解决方案更或不太相同的情况下(通过流作为JobParameter)在这里讨论:Passing stream to job as parameter


总之,答案是否定的,你只能通过普米族作为JobParameters和重写它似乎是灰心的类型。可选的解决方案是声明和注入Bean的参数或使用静态变量在项目范围内访问它。

+0

@thanks Thrax为您的响应。 –

2

我总结了为什么在这个question中无法发送对象为JobParameter的原因。关于这个问题,有几个想法可以做到。我认为最好的方式是在DB中创建表,并存储Object,并将该记录的id作为JobParameter传递或将Object序列化为json,然后将其作为Job作为JobParameter作为字符串传递给Job。如果使用第二个选项,请注意string_val作为varchar 250存储在数据库中,因此限制为250个字符。

+0

感谢您的回复bozic。我已经实施使用Json的serilization ..我正在寻找任何其他选项可用我的好奇心......任何方式感谢所以为响应 –

0

我发现只是如果你的字符串参数长度是固定的方式,但它大于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())); 

组态参数和范围中的 “台阶”:

<bean id="someStep01Writer" class="path.to.some.StepWriter" scope="step"> 
    <property name="someUsefulProperty" value="#{jobParameters['useful.parameter.1'] + jobParameters['useful.parameter.2'] + jobParameters['useful.parameter.3']}"/> 
</bean> 

希望它能帮助。

0

使用下面的类来发送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; 
     } 
    } 

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

用法:

  1. 发送参数:

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

  2. 检索参数:

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

相关问题