Ensure step and job execution deserialisation works properly.

Fix bug in infinite loop sample.
This commit is contained in:
dsyer
2008-10-07 10:15:33 +00:00
parent fa7b6e4525
commit 7ad93d227e
5 changed files with 49 additions and 27 deletions

View File

@@ -16,6 +16,8 @@
package org.springframework.batch.core;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -51,7 +53,7 @@ public class JobExecution extends Entity {
private volatile ExecutionContext executionContext = new ExecutionContext();
private volatile List<Throwable> failureExceptions = new ArrayList<Throwable>();
private transient volatile List<Throwable> failureExceptions = new ArrayList<Throwable>();
/**
* Because a JobExecution isn't valid unless the job is set, this
@@ -158,14 +160,6 @@ public class JobExecution extends Entity {
return stepExecution;
}
/*
* (non-Javadoc)
* @see org.springframework.batch.core.domain.Entity#toString()
*/
public String toString() {
return super.toString() + ", startTime=" + startTime + ", endTime=" + endTime + ", job=[" + jobInstance + "]";
}
/**
* Test if this {@link JobExecution} indicates that it is running. It should
* be noted that this does not necessarily mean that it has been persisted
@@ -261,17 +255,6 @@ public class JobExecution extends Entity {
return failureExceptions;
}
/**
* Set the list of failure causing exceptions for this JobExecution. It
* should be noted that the exceptions should only be for the job execution
* not step executions.
*
* @param failureExceptions
*/
public void setFailureExceptions(List<Throwable> failureExceptions) {
this.failureExceptions = failureExceptions;
}
/**
* Add the provided throwable to the failure exception list.
*
@@ -297,4 +280,21 @@ public class JobExecution extends Entity {
return allExceptions;
}
/**
* Deserialise and ensure transient fields are re-instantiated when read back
*/
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
failureExceptions = new ArrayList<Throwable>();
}
/*
* (non-Javadoc)
* @see org.springframework.batch.core.domain.Entity#toString()
*/
public String toString() {
return super.toString() + String.format(", startTime=%s, endTime=%s, lastUpdated=%s, status=%s, exitStatus=%s, job=[%s]",startTime,endTime,lastUpdated,status,exitStatus,jobInstance);
}
}

View File

@@ -16,6 +16,8 @@
package org.springframework.batch.core;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -467,6 +469,14 @@ public class StepExecution extends Entity {
return stepName.equals(other.getStepName()) && (jobExecutionId.equals(other.getJobExecutionId()));
}
/**
* Deserialise and ensure transient fields are re-instantiated when read back
*/
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
failureExceptions = new ArrayList<Throwable>();
}
/*
* (non-Javadoc)
*
@@ -480,8 +490,8 @@ public class StepExecution extends Entity {
public String toString() {
return super.toString()
+ String.format(", name=%s, readCount=%d, filterCount=%d, writeCount=%d readSkipCount=%d, writeSkipCount=%d"
+ ", commitCount=%d, rollbackCount=%d", stepName, readCount, filterCount, writeCount, readSkipCount, writeSkipCount,
+ String.format(", name=%s, status=%s, exitStatus=%s, readCount=%d, filterCount=%d, writeCount=%d readSkipCount=%d, writeSkipCount=%d"
+ ", commitCount=%d, rollbackCount=%d", stepName, status, exitStatus, readCount, filterCount, writeCount, readSkipCount, writeSkipCount,
commitCount, rollbackCount);
}

View File

@@ -172,6 +172,7 @@ public class JobExecutionTests {
JobExecution deserialize = (JobExecution) SerializationUtils.deserialize(serialized);
assertEquals(execution, deserialize);
assertNotNull(deserialize.createStepExecution("foo"));
assertNotNull(deserialize.getFailureExceptions());
}
public void testFailureExceptions(){

View File

@@ -263,6 +263,7 @@ public class StepExecutionTests {
assertEquals(execution, deserialized);
assertEquals(status, deserialized.getExitStatus());
assertNotNull(deserialized.getFailureExceptions());
}
@Test

View File

@@ -21,6 +21,7 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.batch.item.ItemWriter;
@@ -32,13 +33,21 @@ import org.springframework.batch.item.ItemWriter;
* @author Lucas Ward
*
*/
public class InfiniteLoopWriter extends StepExecutionListenerSupport implements
ItemWriter<Object> {
public class InfiniteLoopWriter extends StepExecutionListenerSupport implements ItemWriter<Object> {
private StepExecution stepExecution;
private int count = 0;
private static final Log logger = LogFactory
.getLog(InfiniteLoopWriter.class);
private static final Log logger = LogFactory.getLog(InfiniteLoopWriter.class);
/**
* @see StepExecutionListener#beforeStep(StepExecution)
*/
@Override
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
/**
*
@@ -50,7 +59,8 @@ public class InfiniteLoopWriter extends StepExecutionListenerSupport implements
public void write(List<? extends Object> items) throws Exception {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Job interrupted.");
}