Digging into Spring Batch, I'd like to know as to How can we share data between the different steps of a Job?
Can we use JobRepository for this? If yes, how can we do that?
Is there any other way of doing/achieving the same?
Thanks, Karan
Digging into Spring Batch, I'd like to know as to How can we share data between the different steps of a Job?
Can we use JobRepository for this? If yes, how can we do that?
Is there any other way of doing/achieving the same?
Thanks, Karan
From a step, you can put data into the StepExecutionContext. Then, with a listener, you can promote data rom StepExecutionContext to JobExecutionContext.
This JobExecutionContext is available in all the following steps.
Becareful : data must be short. These contexts are saved in the JobRepository by serialization and the length is limited (2500 chars if I remember well).
So these contexts are good to share strings or simple values, but not for sharing collections or huge amounts of data.
SHaring huge amounts of data is not the philosophy of Spring Batch. Spring Batch is a set of distincts actions, not a huge Business processing unit.
the job repository is used indirectly for passing data between steps (Jean-Philippe is right that the best way to do that is to put data into the StepExecutionContext
and then use the verbosely named ExecutionContextPromotionListener
to promote the step execution context keys to the JobExecutionContext
.
It's helpful to note that there is a listener for promoting JobParameter
keys to a StepExecutionContext
as well (the even more verbosely named JobParameterExecutionContextCopyListener
); you will find that you use these a lot if your job steps aren't completely independent of one another.
Otherwise you're left passing data between steps using even more elaborate schemes, like JMS queues or (heaven forbid) hard-coded file locations.
As to the size of data that is passed in the context, I would also suggest that you keep it small (but I haven't any specifics on the