how to send a custom object as Job Parameter in Spring Batch?

限于喜欢 提交于 2019-12-03 15:49:57
Thrax

This question has been asked on the offical Spring Batch forum : http://forum.spring.io/forum/spring-projects/batch/96660-how-to-pass-complex-objects-to-job-launcher

A Jira was open then but the developpers chose not to resolve it (Won't fix) : https://jira.spring.io/browse/BATCH-966

An alternative solution for a more or less identical case (passing a stream as a JobParameter) was discussed here : Passing stream to job as parameter


To summarize, the answer is no you can only pass primitive types as JobParameters and overriding it seems to be discouraged. The alternative solutions are to either declare and inject a Bean with your parameters or to use a static variable to access it project-wide.

Nenad Bozic

I have summarized reasons why you cannot send object as JobParameter in this question. There are couple of ideas on that question how you can do it.

TL:TR: I think best way would be either to create table in DB which stores Object and pass id of that record as JobParameter or to serialize Object to json and pass it as String in job as JobParameter. If you go with second option be aware that string_val is stored in DB as varchar 250 so limit is 250 characters.

You would use ThreadLocal before init the job execution, there is a tutorial in spanish about how to use ThreadLocal:

http://aquiseprograma.co/2015/09/como-pasar-variables-o-valores-entre-metodos-sin-que-sea-como-parametro-dentro-del-mismo-hilo-de-ejecucion-en-java-threadlocal/

I've found a way just if your string parameter length is fixed, but it is greater than 250. Just split it into pieces of 250, then, within the XML configuration use Spring EL in this way:

Set your parameter in your main Class like this:

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()));

Configure your parameters and the scope in "step":

<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>

Hope it helps.

Use the below class to send 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;
        }
    }

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

Usage:

  1. Sending parameter:

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

  2. Retrieving parameter:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!