我需要使用spring批处理来读取从数据库中检索到的现有逻辑,现有的目标对象方法在从数据库查询后返回对象列表。
所以我有一个任务要以块的形式阅读。当我从现有代码中看到列表大小时,我看到它大约是15000,但是在实现弹簧批处理时,我想要读取100块,而这不是通过ItemReaderAdapter发生的。
下面的代码片段可以让您了解我提到的问题。那么这可以从Spring Batch中获得。我注意到Delegating Job Sample Spring示例,但是那里的服务返回每个块上的对象而不是总列表对象。
请咨询
Job.xml
<step id="firststep">
<tasklet>
<chunk reader="myreader" writer="mywriter"
commit-interval="100" />
</tasklet>
</step>
<job id="firstjob" incrementer="idIncrementer">
<step id="step1" parent="firststep" />
</job>
<beans:bean id=" myreader "
class="org.springframework.batch.item.adapter.ItemReaderAdapter">
<beans:property name="targetObject" ref="readerService" />
<beans:property name="targetMethod" value="getCustomer" />
</beans:bean>
beans:bean id="readerService "
class="com.sh.java.ReaderService">
</beans:bean>
ReaderService.java
Public ReaderService{
Public List<CustomItem> getCustomer() throws Exception{
/*code to get database instances
*
*/
List< CustomItem> customList = dao.getCustomers(date);
System.out.println(“Customer List Size: ”+customList.size()); //Here it is 15K
return (List<CustomItem>) customList;
}
}
答案 0 :(得分:0)
在所有之前:阅读15K列表&lt;&gt;对象可能会影响(负面)性能;检查您是否可以编写自定义SQL查询并使用JDBC / Hibernate游标项目阅读器。
使用ItemReaderAdapter
(它不是为了读取一大块对象而设计的)是不可能的,但是你可以通过编写自定义ItemReader
扩展{{3}来获得相同的结果继承ItemStream
能力并覆盖抽象或无操作方法;尤其是:
doOpen()
致电您的readerService.getCustomers()
并在班级变量中保存List<>
,doRead()
中阅读下一项 - 来自List&lt;&gt;阅读doOpen()
- 使用存储在ExecutionContext
答案 1 :(得分:0)
@Bellabax,
按照您的建议方式也会读取doOpen中的整个数据库记录,但是,从doOpen检索到的列表中,读取器会以块的形式读取它。请指教
<强> CustomerReader.java 强>
public class CustomerReader extends
AbstractItemCountingItemStreamItemReader<Customer>
{
List<Customer> customerList;
public CustomerReader ()
{
}
@Override
protected void doClose() throws Exception
{
customerList.clear();
setMaxItemCount(0);
setCurrentItemCount(0);
}
@Override
protected void doOpen() throws Exception
{
customList = dao.getCustomers(date);
System.out.println("Customer List Size: "+list.size()); //This still prints 15k
setMaxItemCount(list.size());
}
@Override
protected Customer doRead() throws Exception
{
//Here reading 15K in chunks!
Customer customer = customList.get(getCurrentItemCount() - 1);
return customer;
}
}