What's the best way to pass a huge collection to a Spring Batch Step?

烂漫一生 提交于 2020-01-01 19:58:39

问题


Use case:

  1. A one-time read of data set X (from database) into a Collection C. [Collection size could be say 5000]
  2. Use Collection C to process/enrich items in a Spring Batch Step (say enrichStep)

If C is much greater than what can be passed via ExecutionContext, how can we make it available in the ItemProcessor of the enrichStep?


回答1:


In your enrichStep add a StepExecutionListener.beforeStep and load your huge collection in a HugeCollectionBeanHolder bean.
In this way you will load collection only once (when step start or re-start) and without persist it into execution context. In your enrich processor wire the HugeCollectionBeanHolder to access huge collection.

class HugeCollectionBeanHolder {
 Collection<Item> hudeCollection;

 void setHugeCollection(Collection<Item> c) { this.hugeCollection = c;}
 Collection<Item> getHugeCollection() { return this.hugeCollection;}
}

class MyProcessor implements ItemProcessor<Input,Output> {
 HugeCollectionBeanHolder hcbh;

 void setHugeCollectionBeanHolder(HugeCollectionBeanHolder bean) { this.hcbh = bean;}

 // other methods...
}

You can also look at Spring Batch: what is the best way to use, the data retrieved in one TaskletStep, in the processing of another step



来源:https://stackoverflow.com/questions/20975355/whats-the-best-way-to-pass-a-huge-collection-to-a-spring-batch-step

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