Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7744025
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 1, 20262026-06-01T09:40:29+00:00 2026-06-01T09:40:29+00:00

I’m a newbie in Spring Batch. I have inherited a batch process implemented with

  • 0

I’m a newbie in Spring Batch. I have inherited a batch process implemented with Spring Batch.
This works well, except for one thing I’ll try to describe.

I launch parseJob and, when it’s reading XML to process in bean parsingStepReader,
read() method is been invoking always.

The directory *path_to_xml* contains only one XML, invoke read() and return XML parsed, which is processed OK. Then, read() method is invoked again, return a null object, and is invoked again, return null… and so on.

When debugging, MultiResourceItemReader read method try to read, does not read anything (all resources has already been readed), increment currentResources and return null.

I have readed something about the job stops when the reader return a null object, but that read method returns null and reads again and again…
I changed restartable to false, but does not work.

The job is launched in Linux, batch mode, with org.springframework.batch.core.launch.support.CommandLineJobRunner
Because of this problem, the .sh that launch the job does not finish, and resources are busy.

How can I avoid this, or stop the job when resources (XML) input directory have already been processed?
Any help would be very appreciated. Best regards.

Beans file and Java class pieces are attached

<batch:job id="parseJob" restartable="true" incrementer="jobParametersIncrementer">
    <batch:flow parent="parseFlow"/>
    <batch:flow .../>
    <batch:flow .../>
</batch:job>

<batch:flow id="parseFlow">
    <batch:step id="parsingStep">
        <batch:tasklet start-limit="100" allow-start-if-complete="true" transaction-manager="..." task-executor="taskExecutor" throttle-limit="$...">
            <batch:chunk reader="parsingStepReader" writer="..." processor="..." commit-interval="..." skip-limit="10000000">
                <batch:skippable-exception-classes>
                    <batch:include class="java.lang.Exception" />
                </batch:skippable-exception-classes>
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="iwListener" />
                <batch:listener ref="mySkipListener" />
                <batch:listener ref="myStep1Listener" />
            </batch:listeners>
            <batch:no-rollback-exception-classes>
                <batch:include class="java.lang.Exception" />
            </batch:no-rollback-exception-classes>
        </batch:tasklet>
    </batch:step>
</batch:flow>

<!-- -->

<bean id="bpfReader" class="org.springframework.batch.item.xml.StaxEventItemReader" scope="prototype">
    <property name="fragmentRootElementName" value="..." />
    <property name="unmarshaller" ref="..." />
    <property name="strict" value="false" />
</bean>

<bean id="multiresourceItemReader" class="...SyncMultiResourceItemReader" abstract="true">
    <property name="strict" value="false" />
    <property name="delegate" ref="bpfReader" />
</bean>

<bean id="parsingStepReader" parent="multiresourceItemReader" scope="step">
    <property name="resources" value="<path_to_xml>" />
</bean>

And the reader class is:

public class SyncMultiResourceItemReader<T> extends MultiResourceItemReader<T> {
    . . .

    @Override
    public T read() throws Exception, UnexpectedInputException, ParseException {
        synchronized (this) {
            return super.read();
        }
    }

    . . .
}

UPDATE: Solution suggested by @vsingh works perfectly. Once an input element is chosen, it must be removed from the input. I don’t know why, but class org.springframework.batch.item.file.MultiResourceItemReader does not work as I expected, especially in an input error.

I hope this helps. Best regards

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-01T09:40:30+00:00Added an answer on June 1, 2026 at 9:40 am

    The read method will read the data , store at class level and pass it to the write method.
    I will give you an example of how we did it

    for eg

    @Override
    public Long read() throws Exception, UnexpectedInputException,
            ParseException, NonTransientResourceException {
        synchronized (this.myIds) {
            if (!this.myIds.isEmpty()) {
                return this.myIds.remove(0);
            }
            return null;
        }
    }
    

    myIds is a List at class level

    This list is populated at before step method

    @Override
    public void beforeStep(final StepExecution stepExec) {
        this.stepExecution = stepExec;
                // read the ids from service and set at class level  
    
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a string like this: La Torre Eiffel paragonata all&#8217;Everest What PHP function
this is what i have right now Drawing an RSS feed into the php,
I have this code to decode numeric html entities to the UTF8 equivalent character.
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this
I have this code: - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock { NSString *someString = [[NSString
I have thousands of HTML files to process using Groovy/Java and I need to
I have some data like this: 1 2 3 4 5 9 2 6
link Im having trouble converting the html entites into html characters, (&# 8217;) i
I have just tried to save a simple *.rtf file with some websites and
For some reason, after submitting a string like this Jack’s Spindle from a text

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.