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:
@@ -45,6 +45,6 @@ public interface Chunker {
|
||||
*
|
||||
* @param stepExecution
|
||||
*/
|
||||
public void flush(StepExecution stepExecution);
|
||||
public void flush(Entity stepExecution);
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -357,6 +357,7 @@ public class StepExecution extends Entity {
|
||||
*/
|
||||
public synchronized void rollback() {
|
||||
rollbackCount++;
|
||||
decrementVersion();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +216,6 @@ public class JdbcStepExecutionDao extends AbstractJdbcBatchMetadataDao
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
getJdbcTemplate().execute(getQuery(INSERT_STEP_EXECUTION_ATTRS), callback);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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} ,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user