Spring Batch在分区程序执行后不调用ItemReader

时间:2016-01-13 14:31:59

标签: spring spring-batch

我想使用分区器配置SpringBatch。 Parttioner会将数据列表分成多个块,ItemReader将处理这些数据。但在我成功调用Parttioner之后,它不会调用ItemReader的read()方法。以下是代码段和代码。你能告诉我什么是错的吗?

<batch:job id="cycleJob">
                        <batch:step id="step1">
                            <batch:partition partitioner="cyclePartitioner">
                                <batch:step>
                                    <batch:tasklet task-executor="taskExecutor" throttle-limit="1">
                                        <batch:chunk processor="itemProcessor" reader="itemReader" writer="itemWriter" commit-interval="10">
                                        </batch:chunk>
                                    </batch:tasklet>
                                </batch:step>
                                <batch:handler task-executor="taskExecutor" grid-size="${maxThreads}" />
                            </batch:partition>
                        </batch:step>
                    </batch:job>

            <bean id="itemProcessor" class="com.navisys.besystem.batch.CycleItemProcessor">
                    <property name="transactionTemplate" ref="txTemplate"/>
                    <property name="processorType" value="Batch.executeCycle"/>
                </bean>
                <bean id="itemWriter" class="com.navisys.besystem.batch.CycleItemWriter" />

            <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
                    <constructor-arg type="java.lang.String" value="cycle-" />
                    <property name="concurrencyLimit" value="${maxThreads}" />
                </bean>
                <bean id="itemReader" scope="step" class="com.navisys.besystem.batch.CycleItemReader">
                    <property name="dao" ref="cycledao" />
                    <property name="cycleDate" value="${cycleDate}" />
                    <property name="batchIds" value="${batchIds}" />
                    <property name="switches" value="${switches}" />
                    <property name="workItemsPerMessage" value="${workItemsPerMessage}" />
                    <property name="policyMask" value="${policyMask}"></property>
                    <property name="mainFile" value="${mainFile}" />
                    <property name="datafileLocation" value="${datafileLocation}"></property>
                    <property name="data" value="#{stepExecutionContext['data']}" />
                </bean>

                <bean id="cyclePartitioner" class="com.navisys.besystem.batch.CyclePartitioner">
                    <property name="dao" ref="cycledao" />
                    <property name="cycleDate" value="${cycleDate}" />
                    <property name="batchIds" value="${batchIds}" />
                    <property name="currentSwitch" value="R"></property>
                </bean>


    public class CyclePartitioner implements Partitioner {
     @Override
        public Map<String, ExecutionContext> partition(int gridSize) {
            final Map<String, ExecutionContext> contextMap = new HashMap<>();
            List<BatchContractIdData> list = initialize();

            int partionCount = 0;
            int itemsPerList = (null == list || list.isEmpty())?1:(int)(Math.ceil(list.size()/gridSize));

            for(List<BatchContractIdData> data:Lists.partition(list, itemsPerList)){
                 ExecutionContext context = new ExecutionContext();
                 context.put("data", new ArrayList<BatchContractIdData>(data));
                 contextMap.put(getPartitionName(++partionCount), context);
            }

            return contextMap;
        }

    }

0 个答案:

没有答案