Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Batch Failed to serialize object of type: class org.springframework.batch.core.StepExecution

I have a Spring Batch job with is now giving me an error: Failed to serialize object of type: class org.springframework.batch.core.StepExecution the Job Listener is printing the following exception:

org.springframework.batch.core.JobExecutionException: Flow execution ended unexpectedly
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:140) ~[FlowJob.class:3.0.6.RELEASE]
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306) ~[AbstractJob.class:3.0.6.RELEASE]
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135) [SimpleJobLauncher$1.class:3.0.6.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_51]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_51]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_51]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_51]

The configuration is as follows:

  <job id="job2" restartable="false" job-repository="jobRepository" parent="baseJob">
<step id="job2StepBootstrap" parent="parentJobStep">
  <tasklet ref="job2TaskBootstrap"  transaction-manager="jobsTransactionManager" />
</step>
<listeners>
  <listener ref="job2JobListener"/>
</listeners>

More

<bean id="jobsTransactionManager"
   class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />


<bean id="jobRepository"
          class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="jobsTransactionManager" />            
<property name="isolationLevelForCreate" value="ISOLATION_SERIALIZABLE" />    
<property name="validateTransactionState" value="false"/>

its not so obvious to me what is wrong, i really appreciate your help. I dont want to save the jobs metadata at all.

public class BatchDeploymentTaskBootstrap implements Tasklet, Serializable{

 @Override
  public RepeatStatus execute(StepContribution stepContribution,         ChunkContext chunkContext) throws Exception {
    System.out.println("Running Batch Job Task(%s)...  ");
    return RepeatStatus.FINISHED;
  }
}

I have added the job2TaskBootstrap as you can see even the stripped down version doesn't work.

The complete stack trace printed from the job listener afterJob method.

org.springframework.batch.core.JobExecutionException: Flow execution ended unexpectedly
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:140) ~[FlowJob.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306) ~[AbstractJob.class:3.0.6.RELEASE]
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135) [SimpleJobLauncher$1.class:3.0.6.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_51]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_51]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_51]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_51]
Caused by: org.springframework.batch.core.job.flow.FlowExecutionException: Ended flow=job2 at state=job2.job2TaskBootstrap with exception
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:178) ~[SimpleFlow.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) ~[SimpleFlow.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134) ~[FlowJob.class:3.0.6.RELEASE]
    ... 7 common frames omitted
Caused by: java.lang.IllegalArgumentException: Failed to serialize object of type: class org.springframework.batch.core.StepExecution
    at org.springframework.util.SerializationUtils.serialize(SerializationUtils.java:49) ~[SerializationUtils.class:4.2.4.RELEASE]
    at org.springframework.batch.core.repository.dao.MapStepExecutionDao.copy(MapStepExecutionDao.java:53) ~[MapStepExecutionDao.class:3.0.6.RELEASE]
    at org.springframework.batch.core.repository.dao.MapStepExecutionDao.saveStepExecution(MapStepExecutionDao.java:83) ~[MapStepExecutionDao.class:3.0.6.RELEASE]
    at org.springframework.batch.core.repository.support.SimpleJobRepository.add(SimpleJobRepository.java:170) ~[SimpleJobRepository.class:3.0.6.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) ~[AopUtils.class:4.2.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[ReflectiveMethodInvocation.class:4.2.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[ReflectiveMethodInvocation.class:4.2.4.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[TransactionInterceptor$1.class:4.2.4.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[TransactionAspectSupport.class:4.2.4.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[TransactionInterceptor.class:4.2.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[ReflectiveMethodInvocation.class:4.2.4.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) ~[JdkDynamicAopProxy.class:4.2.4.RELEASE]
    at com.sun.proxy.$Proxy65.add(Unknown Source) ~[na:na]
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:144) ~[SimpleStepHandler.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) ~[JobFlowExecutor.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) ~[StepState.class:3.0.6.RELEASE]
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) ~[SimpleFlow.class:3.0.6.RELEASE]
    ... 9 common frames omitted
Caused by: java.io.NotSerializableException: sun.nio.fs.WindowsPath
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) ~[na:1.8.0_51]
    at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1413) ~[na:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_51]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) ~[na:1.8.0_51]
    at org.springframework.util.SerializationUtils.serialize(SerializationUtils.java:45) ~[SerializationUtils.class:4.2.4.RELEASE]
    ... 29 common frames omitted
like image 285
tinashe.chipomho Avatar asked Sep 08 '25 10:09

tinashe.chipomho


2 Answers

One or more of your classes used in your step is missing an implements Serializable in the class declaration.

Anything saved to the jobRepository needs to be serializable. This may be used as part of the step execution context data that is saved.

like image 174
leeor Avatar answered Sep 10 '25 04:09

leeor


I was putting a class's object into my chunkContext inside a tasklet using this command :-

chunkContext.getStepContext().getStepExecution().getJobExecution()
          .getExecutionContext().put("objectToBeStored", obj);

suppose this obj belongs to class A, then I made A implements serializable and this error was gone.

like image 38
Shivangi Shukla Avatar answered Sep 10 '25 03:09

Shivangi Shukla