OPEN - issue BATCH-364: StepScope responsibilities can be assumed by Step (not ApplicationContext)

http://jira.springframework.org/browse/BATCH-364

Extend columns in attrs table -to avoid crashes resulting in optimistic lock failure.
This commit is contained in:
dsyer
2008-02-15 14:40:33 +00:00
parent 0fc3ec4cfc
commit 7096c8c024
19 changed files with 65 additions and 46 deletions

View File

@@ -45,6 +45,6 @@ public interface Chunker {
*
* @param stepExecution
*/
public void flush(StepExecution stepExecution);
public void flush(Entity stepExecution);
}

View File

@@ -75,6 +75,17 @@ public class Entity implements Serializable {
}
}
/**
*
*/
protected void decrementVersion() {
if (version == null || version.intValue()==0) {
version = new Integer(0);
} else {
version = new Integer(version.intValue() - 1);
}
}
// @Override
public String toString() {
return ClassUtils.getShortName(getClass()) + ": id=" + getId();
@@ -121,4 +132,5 @@ public class Entity implements Serializable {
}
return 39 + 87 * id.hashCode();
}
}

View File

@@ -357,6 +357,7 @@ public class StepExecution extends Entity {
*/
public synchronized void rollback() {
rollbackCount++;
decrementVersion();
}
/**

View File

@@ -210,28 +210,28 @@ public class StepExecutionTests extends TestCase {
}
public void testEqualsWithSameIdentifier() throws Exception {
StepExecution step1 = newStepExecution(new Long(100), new Long(11));
StepExecution step2 = newStepExecution(new Long(100), new Long(11));
Entity step1 = newStepExecution(new Long(100), new Long(11));
Entity step2 = newStepExecution(new Long(100), new Long(11));
assertEquals(step1, step2);
}
public void testEqualsWithNull() throws Exception {
StepExecution step = newStepExecution(new Long(100), new Long(11));
Entity step = newStepExecution(new Long(100), new Long(11));
assertFalse(step.equals(null));
}
public void testEqualsWithNullIdentifiers() throws Exception {
StepExecution step = newStepExecution(new Long(100), new Long(11));
Entity step = newStepExecution(new Long(100), new Long(11));
assertFalse(step.equals(new StepExecution()));
}
public void testEqualsWithNullJob() throws Exception {
StepExecution step = newStepExecution(null, new Long(11));
Entity step = newStepExecution(null, new Long(11));
assertFalse(step.equals(new StepExecution()));
}
public void testEqualsWithNullStep() throws Exception {
StepExecution step = newStepExecution(new Long(11), null);
Entity step = newStepExecution(new Long(11), null);
assertFalse(step.equals(new StepExecution()));
}
@@ -240,7 +240,7 @@ public class StepExecutionTests extends TestCase {
}
public void testEqualsWithDifferent() throws Exception {
StepExecution step = newStepExecution(new Long(43), new Long(13));
Entity step = newStepExecution(new Long(43), new Long(13));
assertFalse(execution.equals(step));
}

View File

@@ -216,7 +216,6 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao
}
}
};
getJdbcTemplate().execute(getQuery(INSERT_STEP_EXECUTION_ATTRS), callback);
}

View File

@@ -23,6 +23,7 @@ import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.springframework.batch.core.domain.Entity;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.StepExecution;
@@ -123,7 +124,7 @@ public class MapStepDao implements StepDao {
Entry entry = (Entry)it.next();
Set executions = (Set)entry.getValue();
for(Iterator executionsIt = executions.iterator();executionsIt.hasNext();){
StepExecution stepExecution = (StepExecution)executionsIt.next();
Entity stepExecution = (Entity)executionsIt.next();
if(stepExecution.getId() == stepExecutionId){
stepExecutions.add(stepExecution);
}

View File

@@ -21,6 +21,7 @@ import java.util.List;
import org.springframework.batch.core.domain.Chunk;
import org.springframework.batch.core.domain.Chunker;
import org.springframework.batch.core.domain.ChunkingResult;
import org.springframework.batch.core.domain.Entity;
import org.springframework.batch.core.domain.ItemSkipPolicy;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.io.exception.ReadFailureException;
@@ -98,7 +99,7 @@ public class ItemChunker implements Chunker {
/**
* No-op implementation.
*/
public void flush(StepExecution stepExecution) {
public void flush(Entity stepExecution) {
}
}

View File

@@ -294,7 +294,7 @@ public class SimpleStepExecutor implements InitializingBean {
boolean isRestart = stepInstance.getStepExecutionCount() > 0 ? true : false;
ExitStatus status = ExitStatus.FAILED;
try {
stepExecution.setStartTime(new Date(System.currentTimeMillis()));
@@ -434,9 +434,15 @@ public class SimpleStepExecutor implements InitializingBean {
jobRepository.saveOrUpdate(stepExecution);
streamManager.close(stepExecution);
}
catch (Exception e) {
logger
.error(
"Failed to update step execution: probably fatal, so there is already an exception on the stack.",
e);
}
finally {
// clear any registered synchronizations
StepSynchronizationManager.close();
}
}

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT NUMBER(38) ,
TASK_COUNT NUMBER(38) ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID NUMBER(38) NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -53,7 +53,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -61,8 +61,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -40,7 +40,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT ${BIGINT} ,
TASK_COUNT ${BIGINT} ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -48,8 +48,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID ${BIGINT} NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL ${DOUBLE} ,

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.execution.repository;
import java.util.List;
import org.springframework.batch.core.domain.Entity;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.StepExecution;
@@ -85,7 +86,7 @@ public class MockStepDao implements StepDao {
ExecutionContext executionContext) {
}
public StepExecution getStepExecution(Long stepExecutionId,
public Entity getStepExecution(Long stepExecutionId,
StepInstance stepInstance) {
return null;
}

View File

@@ -25,6 +25,7 @@ import junit.framework.TestCase;
import org.easymock.ArgumentsMatcher;
import org.easymock.MockControl;
import org.springframework.batch.core.domain.Entity;
import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.JobParameters;
@@ -169,8 +170,8 @@ public class SimpleJobRepositoryTests extends TestCase {
// and the executions in the list contain one with an end date
execution.setEndTime(new Date(System.currentTimeMillis()));
StepExecution databaseStep1Exec = new StepExecution(databaseStep1, execution, new Long(1));
StepExecution databaseStep2Exec = new StepExecution(databaseStep2, execution, new Long(2));
Entity databaseStep1Exec = new StepExecution(databaseStep1, execution, new Long(1));
Entity databaseStep2Exec = new StepExecution(databaseStep2, execution, new Long(2));
List jobs = new ArrayList();
jobDao.findJobInstances(jobConfiguration.getName(), jobParameters);
@@ -411,8 +412,8 @@ public class SimpleJobRepositoryTests extends TestCase {
public void testFindStepsFixesInvalidExecutionContext() throws Exception {
StepExecution databaseStep1Exec = new StepExecution(databaseStep1, null, new Long(1));
StepExecution databaseStep2Exec = new StepExecution(databaseStep2, null, new Long(2));
Entity databaseStep1Exec = new StepExecution(databaseStep1, null, new Long(1));
Entity databaseStep2Exec = new StepExecution(databaseStep2, null, new Long(2));
List jobs = new ArrayList();
jobDao.findJobInstances(jobConfiguration.getName(), jobParameters);

View File

@@ -40,7 +40,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
TASK_COUNT BIGINT ,
TASK_STATISTICS VARCHAR(2500),
TASK_STATISTICS VARCHAR(500),
CONTINUABLE CHAR(1),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500));
@@ -48,8 +48,8 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CREATE TABLE BATCH_STEP_EXECUTION_ATTRS (
STEP_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
KEY_NAME VARCHAR(1000) NOT NULL ,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP ,
LONG_VAL VARCHAR(10) ,
DOUBLE_VAL DOUBLE PRECISION ,

View File

@@ -18,10 +18,7 @@
<bean id="step1" parent="taskletStep">
<property name="tasklet">
<bean id="module"
class="org.springframework.batch.sample.tasklet.InfiniteLoopTasklet"
scope="step">
<aop:scoped-proxy />
</bean>
class="org.springframework.batch.sample.tasklet.InfiniteLoopTasklet"/>
</property>
<property name="listener">
<bean