title: Spring Batch JpaPagingItemReader Hangs
body: <p>I have a very simple setup with spring batch - just a reader and writer:</p>
  
  <pre><code>@Bean(name = { "defaultCatalogSyncStep", "catalogSyncStep" })
  public Step defaultCatalogSyncStep() {
      return stepBuilders.get("catalog-sync")
          .&lt;AbstractCatalogableEntityModel, AbstractCatalogableEntityModel&gt;chunk(1)
          .reader(defaultAbstractEntityReader())
          .writer(defaultAbstractEntityWriter())
          .build();
  }
  
  @StepScope
  @Bean(name = {"defaultAbstractEntityReader", "abstractEntityReader"}, destroyMethod="")
  public JpaPagingItemReader&lt;AbstractCatalogableEntityModel&gt; defaultAbstractEntityReader() {
      final JpaPagingItemReader&lt;AbstractCatalogableEntityModel&gt; entityReader = new JpaPagingItemReader&lt;&gt;();
      entityReader.setEntityManagerFactory(entityManager.getEntityManagerFactory());
      entityReader.setQueryString("select p from product p");
      entityReader.setPageSize(1);
  
      return entityReader;
  }
  
  
  @Bean(name = { "defaultAbstractEntityWriter", "abstractEntityWriter" })
  public JpaItemWriter&lt;AbstractCatalogableEntityModel&gt; defaultAbstractEntityWriter() {
      final JpaItemWriter&lt;AbstractCatalogableEntityModel&gt; itemWriter = new JpaItemWriter&lt;&gt;();
      itemWriter.setEntityManagerFactory(entityManager.getEntityManagerFactory());
      return itemWriter;
  }
  </code></pre>
  
  <p>However when I run the job it basically hangs - it just stops responding and does nothing so I have to kill it with Ctrl+C (on windows). But then I can see in the task manager the process is still alive and is not really stopped. So I take a thread dump and here's the result:</p>
  
  <pre><code>2014-06-21 12:30:22
  Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode):
  
  "product.data" prio=6 tid=0x000000000c8a1000 nid=0x607c waiting on condition [0x000000000f5ae000]
     java.lang.Thread.State: TIMED_WAITING (parking)
          at sun.misc.Unsafe.park(Native Method)
          - parking to wait for  &lt;0x00000000c1d4f1b8&gt; (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
          at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
          at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
          at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
          at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          at java.lang.Thread.run(Thread.java:724)
  
  "net.sf.ehcache.CacheManager@7480f19e" daemon prio=6 tid=0x000000000d856800 nid=0x43b4 in Object.wait() [0x000000000e4de000]
     java.lang.Thread.State: TIMED_WAITING (on object monitor)
          at java.lang.Object.wait(Native Method)
          - waiting on &lt;0x00000000c1d3abd8&gt; (a java.util.TaskQueue)
          at java.util.TimerThread.mainLoop(Timer.java:552)
          - locked &lt;0x00000000c1d3abd8&gt; (a java.util.TaskQueue)
          at java.util.TimerThread.run(Timer.java:505)
  
  "jar:file:/C:/Users/Petar/.m2/repository/net/sf/ehcache/ehcache-core/2.6.9/ehcache-core-2.6.9.jar!/ehcache-failsafe.xml::sun.misc.Launcher$AppClassLoader@17072b90::org.
  .jcache.JCacheCachingProvider@1d61ffdf" daemon prio=6 tid=0x000000000bb9c000 nid=0x50b4 in Object.wait() [0x000000000e2df000]
     java.lang.Thread.State: TIMED_WAITING (on object monitor)
          at java.lang.Object.wait(Native Method)
          - waiting on &lt;0x00000000c0af7cc0&gt; (a java.util.TaskQueue)
          at java.util.TimerThread.mainLoop(Timer.java:552)
          - locked &lt;0x00000000c0af7cc0&gt; (a java.util.TaskQueue)
          at java.util.TimerThread.run(Timer.java:505)
  
  "Service Thread" daemon prio=6 tid=0x00000000093a5800 nid=0xfe48 runnable [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  
  "C2 CompilerThread1" daemon prio=10 tid=0x000000000938c000 nid=0x3c2c waiting on condition [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  
  "C2 CompilerThread0" daemon prio=10 tid=0x0000000009389800 nid=0xf604 waiting on condition [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  
  "Attach Listener" daemon prio=10 tid=0x0000000009388800 nid=0x9820 waiting on condition [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  
  "Signal Dispatcher" daemon prio=10 tid=0x0000000009385800 nid=0xe904 runnable [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  
  "Finalizer" daemon prio=8 tid=0x0000000002573000 nid=0xd9cc in Object.wait() [0x000000000a6ef000]
     java.lang.Thread.State: WAITING (on object monitor)
          at java.lang.Object.wait(Native Method)
          - waiting on &lt;0x00000000c0084ab0&gt; (a java.lang.ref.ReferenceQueue$Lock)
          at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
          - locked &lt;0x00000000c0084ab0&gt; (a java.lang.ref.ReferenceQueue$Lock)
          at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
          at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)
  
  "Reference Handler" daemon prio=10 tid=0x0000000009354000 nid=0x6624 in Object.wait() [0x000000000a5ef000]
     java.lang.Thread.State: WAITING (on object monitor)
          at java.lang.Object.wait(Native Method)
          - waiting on &lt;0x00000000c0084b48&gt; (a java.lang.ref.Reference$Lock)
          at java.lang.Object.wait(Object.java:503)
          at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
          - locked &lt;0x00000000c0084b48&gt; (a java.lang.ref.Reference$Lock)
  
  "main" prio=6 tid=0x000000000248c800 nid=0xb6a4 waiting on condition [0x000000000247c000]
     java.lang.Thread.State: WAITING (parking)
          at sun.misc.Unsafe.park(Native Method)
          - parking to wait for  &lt;0x00000000f8dacf88&gt; (a java.util.concurrent.Semaphore$NonfairSync)
          at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
          at java.util.concurrent.Semaphore.acquire(Semaphore.java:317)
          at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:421)
          at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:326)
          at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
          at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
          at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
          at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
          at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
          at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
          at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
          at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:198)
          at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
          at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:386)
          at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:135)
          at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304)
          at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
          at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
          at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
          at com.xxxx.platform.module.batch.core.service.catalog.impl.BatchCatalogServiceImpl.synchronizeCatalog(BatchCatalogServiceImpl.java:44)
          at com.xxx.platform.core.service.catalog.impl.CatalogServiceImpl.synchronizeAllCatalogs(CatalogServiceImpl.java:125)
          at com.xxx.platform.core.service.catalog.impl.CatalogServiceImpl$$FastClassBySpringCGLIB$$e04bedb.invoke(&lt;generated&gt;)
          at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
          at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
          at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
          at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
          at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
          at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
          at com.xxx.platform.module.batch.core.service.catalog.impl.BatchCatalogServiceImpl$$EnhancerBySpringCGLIB$$38a5bbe0.synchronizeAllCatalogs(&lt;generated&gt;)
          at com.xxx.platform.core.service.platform.impl.PlatformServiceImpl.updatePlatformDatabase(PlatformServiceImpl.java:247)
          at com.xxx.platform.core.service.platform.impl.PlatformServiceImpl$$FastClassBySpringCGLIB$$21eaf515.invoke(&lt;generated&gt;)
          at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
          at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649)
          at com.xxx.platform.core.service.platform.impl.PlatformServiceImpl$$EnhancerBySpringCGLIB$$e69580f8.updatePlatformDatabase(&lt;generated&gt;)
          at com.xxx.platform.core.config.PlatformCoreTestConfig$PlatformInitializer.afterPropertiesSet(PlatformCoreTestConfig.java:128)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
          at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
          - locked &lt;0x00000000c0084c40&gt; (a java.util.concurrent.ConcurrentHashMap)
          at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:716)
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
          - locked &lt;0x00000000c0084cd0&gt; (a java.lang.Object)
          at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125)
          at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
          at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
          at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250)
          at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:63)
          at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:83)
          - locked &lt;0x00000000c0084d80&gt; (a org.springframework.test.context.ContextCache)
          at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:74)
          at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
          at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
          at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:189)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:266)
          at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:268)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:209)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:84)
          at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
          at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
          at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
          at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
          at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
          at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
          at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
          at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
          at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:152)
          at org.junit.runners.Suite.runChild(Suite.java:127)
          at org.junit.runners.Suite.runChild(Suite.java:26)
          at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
          at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
          at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
          at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
          at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
          at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
          at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createReqestAndRun(JUnitCoreWrapper.java:139)
          at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:111)
          at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:84)
          at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:135)
          at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
          at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
          at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
  
  "VM Thread" prio=10 tid=0x0000000009352800 nid=0x3b94 runnable
  
  "GC task thread#0 (ParallelGC)" prio=6 tid=0x00000000024a2000 nid=0x3b1c runnable
  
  "GC task thread#1 (ParallelGC)" prio=6 tid=0x00000000024a4000 nid=0x67f8 runnable
  
  "GC task thread#2 (ParallelGC)" prio=6 tid=0x00000000024a5800 nid=0x86e0 runnable
  
  "GC task thread#3 (ParallelGC)" prio=6 tid=0x00000000024a7000 nid=0xa960 runnable
  
  "VM Periodic Task Thread" prio=10 tid=0x000000000abf8800 nid=0xd4b0 waiting on condition
  
  JNI global references: 207
  </code></pre>