Example usage for org.springframework.batch.core.step.item Chunk size

List of usage examples for org.springframework.batch.core.step.item Chunk size

Introduction

In this page you can find the example usage for org.springframework.batch.core.step.item Chunk size.

Prototype

public int size() 

Source Link

Usage

From source file:org.springframework.batch.core.jsr.step.item.JsrChunkProcessor.java

/**
 * Loops through reading (via {@link #provide(StepContribution, Chunk)} and
 * processing (via {@link #transform(StepContribution, Object)}) until the chunk
 * is complete.  Once the chunk is complete, the results are written (via
 * {@link #persist(StepContribution, Chunk)}.
 *
 * @see ChunkProcessor#process(StepContribution, Chunk)
 * @param contribution a {@link StepContribution}
 * @param chunk a {@link Chunk}//from   ww w  .j a v  a 2  s  . com
 */
@Override
public void process(final StepContribution contribution, final Chunk<I> chunk) throws Exception {

    final AtomicInteger filterCount = new AtomicInteger(0);
    final Chunk<O> output = new Chunk<O>();

    repeatTemplate.iterate(new RepeatCallback() {

        @Override
        public RepeatStatus doInIteration(RepeatContext context) throws Exception {
            I item = provide(contribution, chunk);

            if (item != null) {
                contribution.incrementReadCount();
            } else {
                return RepeatStatus.FINISHED;
            }

            O processedItem = transform(contribution, item);

            if (processedItem == null) {
                filterCount.incrementAndGet();
            } else {
                output.add(processedItem);
            }

            return RepeatStatus.CONTINUABLE;
        }
    });

    contribution.incrementFilterCount(filterCount.get());
    if (output.size() > 0) {
        persist(contribution, output);
    }
}

From source file:org.springframework.batch.core.jsr.step.item.JsrFaultTolerantChunkProcessor.java

/**
 * Adds retry and skip logic to the write phase of the chunk loop.
 *
 * @param contribution a {@link StepContribution}
 * @param chunk a {@link Chunk}//from   www .  j  a  va 2  s  .  c  o m
 * @throws Exception
 */
@Override
protected void persist(final StepContribution contribution, final Chunk<O> chunk) throws Exception {

    RetryCallback<Object, Exception> retryCallback = new RetryCallback<Object, Exception>() {
        @Override
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public Object doWithRetry(RetryContext context) throws Exception {

            chunkMonitor.setChunkSize(chunk.size());
            try {
                doPersist(contribution, chunk);
            } catch (Exception e) {
                if (shouldSkip(skipPolicy, e, contribution.getStepSkipCount())) {
                    // Per section 9.2.7 of JSR-352, the SkipListener receives all the items within the chunk                    
                    ((MulticasterBatchListener) getListener()).onSkipInWrite(chunk.getItems(), e);
                } else {
                    getListener().onRetryWriteException((List<Object>) chunk.getItems(), e);

                    if (rollbackClassifier.classify(e)) {
                        throw e;
                    }
                }
                /*
                 * If the exception is marked as no-rollback, we need to
                 * override that, otherwise there's no way to write the
                 * rest of the chunk or to honour the skip listener
                 * contract.
                 */
                throw new ForceRollbackForWriteSkipException(
                        "Force rollback on skippable exception so that skipped item can be located.", e);
            }
            contribution.incrementWriteCount(chunk.size());
            return null;

        }
    };

    RecoveryCallback<Object> recoveryCallback = new RecoveryCallback<Object>() {

        @Override
        public O recover(RetryContext context) throws Exception {
            Throwable e = context.getLastThrowable();
            if (shouldSkip(skipPolicy, e, contribution.getStepSkipCount())) {
                contribution.incrementWriteSkipCount();
                logger.debug("Skipping after failed write", e);
                return null;
            } else {
                if (rollbackClassifier.classify(e)) {
                    // Default is to rollback unless the classifier
                    // allows us to continue
                    throw new RetryException("Non-skippable exception in recoverer while write", e);
                }
                return null;
            }
        }

    };

    batchRetryTemplate.execute(retryCallback, recoveryCallback);
}

From source file:org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.java

@Override
protected void write(final StepContribution contribution, final Chunk<I> inputs, final Chunk<O> outputs)
        throws Exception {
    @SuppressWarnings("unchecked")
    final UserData<O> data = (UserData<O>) inputs.getUserData();
    final AtomicReference<RetryContext> contextHolder = new AtomicReference<RetryContext>();

    RetryCallback<Object, Exception> retryCallback = new RetryCallback<Object, Exception>() {
        @Override/*from   w w  w . j  a  va2  s.  co m*/
        public Object doWithRetry(RetryContext context) throws Exception {
            contextHolder.set(context);

            if (!data.scanning()) {
                chunkMonitor.setChunkSize(inputs.size());
                try {
                    doWrite(outputs.getItems());
                } catch (Exception e) {
                    if (rollbackClassifier.classify(e)) {
                        throw e;
                    }
                    /*
                     * If the exception is marked as no-rollback, we need to
                     * override that, otherwise there's no way to write the
                     * rest of the chunk or to honour the skip listener
                     * contract.
                     */
                    throw new ForceRollbackForWriteSkipException(
                            "Force rollback on skippable exception so that skipped item can be located.", e);
                }
                contribution.incrementWriteCount(outputs.size());
            } else {
                scan(contribution, inputs, outputs, chunkMonitor, false);
            }
            return null;

        }
    };

    if (!buffering) {

        RecoveryCallback<Object> batchRecoveryCallback = new RecoveryCallback<Object>() {

            @Override
            public Object recover(RetryContext context) throws Exception {

                Throwable e = context.getLastThrowable();
                if (outputs.size() > 1 && !rollbackClassifier.classify(e)) {
                    throw new RetryException("Invalid retry state during write caused by "
                            + "exception that does not classify for rollback: ", e);
                }

                Chunk<I>.ChunkIterator inputIterator = inputs.iterator();
                for (Chunk<O>.ChunkIterator outputIterator = outputs.iterator(); outputIterator.hasNext();) {

                    inputIterator.next();
                    outputIterator.next();

                    checkSkipPolicy(inputIterator, outputIterator, e, contribution, true);
                    if (!rollbackClassifier.classify(e)) {
                        throw new RetryException(
                                "Invalid retry state during recovery caused by exception that does not classify for rollback: ",
                                e);
                    }

                }

                return null;

            }

        };

        batchRetryTemplate.execute(retryCallback, batchRecoveryCallback,
                BatchRetryTemplate.createState(getInputKeys(inputs), rollbackClassifier));

    } else {

        RecoveryCallback<Object> recoveryCallback = new RecoveryCallback<Object>() {

            @Override
            public Object recover(RetryContext context) throws Exception {
                /*
                 * If the last exception was not skippable we don't need to
                 * do any scanning. We can just bomb out with a retry
                 * exhausted.
                 */
                if (!shouldSkip(itemWriteSkipPolicy, context.getLastThrowable(), -1)) {
                    throw new ExhaustedRetryException(
                            "Retry exhausted after last attempt in recovery path, but exception is not skippable.",
                            context.getLastThrowable());
                }

                inputs.setBusy(true);
                data.scanning(true);
                scan(contribution, inputs, outputs, chunkMonitor, true);
                return null;
            }

        };

        if (logger.isDebugEnabled()) {
            logger.debug("Attempting to write: " + inputs);
        }
        try {
            batchRetryTemplate.execute(retryCallback, recoveryCallback,
                    new DefaultRetryState(inputs, rollbackClassifier));
        } catch (Exception e) {
            RetryContext context = contextHolder.get();
            if (!batchRetryTemplate.canRetry(context)) {
                /*
                 * BATCH-1761: we need advance warning of the scan about to
                 * start in the next transaction, so we can change the
                 * processing behaviour.
                 */
                data.scanning(true);
            }
            throw e;
        }

    }

    callSkipListeners(inputs, outputs);

}