SpringBatch阅读和写作分块

时间:2016-07-18 20:27:30

标签: java spring spring-batch

我有一个包含一些for循环的程序。该计划的想法是使用多个帐户登录网站并检索列表(每个登录带来不同的列表)。所以我设置它的方式是增强的for循环:

loginsList.put( "firstUsername", "firstPassword" );
loginsList.put( "secondUsername", "secondPassword" );
loginsList.put( "thirdUsername", "thirdPassword" );
loginsList.put( "fourthUsername", "fourthPassword" );
loginsList.put( "fifthUsername", "fifthPassword" );

for ( Entry<String, String> nextLogin : logins.entrySet() ) {
    String nextUser = nextLogin.getKey();
    String nextPass = nextLogin.getValue();

    Response authenticateUserResponse = Jsoup.connect( WEBSITE_I_NEED_TO_LOGIN_TO )
            .data( "username", nextUser )
            .data( "password", nextPass )
            .execute();

基本上这就是我想要的流程:

  

读() - &GT;获取清单----&gt;将list发送到write()方法将其写入数据库 - &gt;循环回来并获得下一次登录 - &gt; read() - &gt;获取列表 - &gt;将其发送到write()....等..

然而我遇到的问题是我的循环在read方法中运行,并且在所有帐户中遍历所有列表之前不会转到write方法。基本上写入只是在结尾处被调用一次,所以我现在所拥有的就是这样(这是有缺陷的设计):

  

read()---&gt;获取列表 - &gt;下一个帐号---&gt;获取列表---下一个帐号---&gt;获取列表---&gt; write()

如何在仅读取块后在Spring中组织块处理?

1 个答案:

答案 0 :(得分:0)

for ( Entry<String, String> nextLogin : logins.entrySet() ) {
    String nextUser = nextLogin.getKey();
    String nextPass = nextLogin.getValue();
     //do something
       ......
     //call write function 
writeValues(x, y, z); 
}

这就是你想要的吗? 否则它看起来像传统的SpringBatch:Read&gt;处理&gt;处理案件。 你的读者会得到一个记录 处理器&gt;保存记录

如果没有错误,Spring批处理会将您移动到下一条记录。

    <step id="processUpdates">
        <tasklet task-executor="batchThreadPoolTaskExecutor" throttle-limit="${batch.cviscoreupdate.threadcount}">
            <chunk reader="Reader" processor="ItemProcessor" writer="ItemWriter" commit-interval="${batch.commit.interval}" skip-limit="${batch.skip.limit}" >
                <skippable-exception-classes>
                    <include class="batch.support.SkipRecordException" />
                </skippable-exception-classes>
            </chunk>
        </tasklet>
        <next on="FAILED" to="errorExit"/>          
        <next on="*" to="moveFilesFromWorkToDone" />
        <listeners>
            <listener ref="UpdateSkipListener"/>
        </listeners>
    </step>

<bean id="CVIScoreUpdateItemProcessor" class="com.batch.MyUpdateItemProcessor" scope="step" init-method="init" />