我有一个自定义对象发送到Spring批处理作业的需求,其中此对象被项目处理器连续用于业务需求。如何在Spring Batch中将自定义对象作为作业参数发送?
我们如何从外部发送自定义对象到作业上下文。此对象从作业更改为作业,并根据业务案例在运行时生成。
如何发送此作为工作参数?或者有什么方法可以将此对象设置为相应的作业?
可以重写Spring JobParameter以任何方式帮助我吗?或者是否有任何重大问题作为此重写行为的结果?
我有一个自定义对象发送到Spring批处理作业的需求,其中此对象被项目处理器连续用于业务需求。如何在Spring Batch中将自定义对象作为作业参数发送?
我们如何从外部发送自定义对象到作业上下文。此对象从作业更改为作业,并根据业务案例在运行时生成。
如何发送此作为工作参数?或者有什么方法可以将此对象设置为相应的作业?
可以重写Spring JobParameter以任何方式帮助我吗?或者是否有任何重大问题作为此重写行为的结果?
这个问题已经被问的官方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的参数或使用静态变量在项目范围内访问它。
@thanks Thrax为您的响应。 –
我总结了为什么在这个question中无法发送对象为JobParameter
的原因。关于这个问题,有几个想法可以做到。我认为最好的方式是在DB中创建表,并存储Object,并将该记录的id作为JobParameter传递或将Object序列化为json,然后将其作为Job作为JobParameter作为字符串传递给Job。如果使用第二个选项,请注意string_val作为varchar 250存储在数据库中,因此限制为250个字符。
感谢您的回复bozic。我已经实施使用Json的serilization ..我正在寻找任何其他选项可用我的好奇心......任何方式感谢所以为响应 –
你会初始化作业执行之前使用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()));
组态参数和范围中的 “台阶”:
<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>
希望它能帮助。
使用下面的类来发送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;
}
}
===========================
发送参数:
JobParameters paramJobParameters = new JobParametersBuilder().addParameter("customparam", new CustomJobParameter<MyClass>(myClassReference)).toJobParameters();
检索参数:
MyClass myclass = (MyClass)jobExecution.getJobParameters().getParameters().get("customparam").getValue();
有什么阻止这个对象被一个bean(或容器中的豆),你可以只电线插入你的处理器? – DBK
@DBK。,它是从数据库中读取的实体。并且对于每项工作,我必须根据功能需要使用不同的实体。 –
对我来说,最简单的方法是将Object序列化到Json,并将它放到String作业参数 –