OPEN - issue BATCH-170: Concurrent modification of StepExecution when running an asynchrounous step operation

http://opensource.atlassian.com/projects/spring/browse/BATCH-170

Fix broken tests.
This commit is contained in:
dsyer
2007-12-19 13:48:29 +00:00
parent 37696b45f4
commit 17d3397594
5 changed files with 53 additions and 388 deletions

View File

@@ -34,12 +34,12 @@ public class Entity implements Serializable {
private Long id;
private Integer version = new Integer(0);
private Integer version;
public Entity() {
super();
}
public Entity(Long id) {
super();
this.id = id;
@@ -59,12 +59,16 @@ public class Entity implements Serializable {
public Integer getVersion() {
return version;
}
/**
*
*/
public void incrementVersion() {
version = new Integer(version.intValue()+1);
if (version == null) {
version = new Integer(0);
} else {
version = new Integer(version.intValue() + 1);
}
}
// @Override

View File

@@ -49,6 +49,14 @@ public class EntityTests extends TestCase {
assertEquals(null, entity.getVersion());
}
/**
* Test method for {@link org.springframework.batch.core.domain.Entity#getVersion()}.
*/
public void testIncrementVersion() {
entity.incrementVersion();
assertEquals(new Integer(0), entity.getVersion());
}
/**
* @throws Exception
*/

View File

@@ -310,6 +310,7 @@ public class SqlStepDao implements StepDao, InitializingBean {
cascadeJobExecution(stepExecution.getJobExecution());
stepExecution.setId(new Long(stepExecutionIncrementer.nextLongValue()));
stepExecution.incrementVersion(); // should be 0 now
Object[] parameters = new Object[] { stepExecution.getId(), new Long(0), stepExecution.getStepId(),
stepExecution.getJobExecutionId(), stepExecution.getStartTime(), stepExecution.getEndTime(),
stepExecution.getStatus().toString(), stepExecution.getCommitCount(), stepExecution.getTaskCount(),

View File

@@ -1,383 +0,0 @@
package org.springframework.batch.execution.repository.dao;
import java.util.List;
import java.util.Map;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.StatementCallback;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.jdbc.support.rowset.SqlRowSet;
public class MockJdbcTemplate implements JdbcOperations {
private String sqlStatement = "";
public String getSqlStatement() {
return sqlStatement;
}
public int[] batchUpdate(String[] sql) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss)
throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Map call(CallableStatementCreator csc, List declaredParameters)
throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object execute(ConnectionCallback action) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object execute(StatementCallback action) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public void execute(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
}
public Object execute(PreparedStatementCreator psc,
PreparedStatementCallback action) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object execute(String sql, PreparedStatementCallback action)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object execute(CallableStatementCreator csc,
CallableStatementCallback action) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object execute(String callString, CallableStatementCallback action)
throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object query(String sql, ResultSetExtractor rse)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public void query(String sql, RowCallbackHandler rch)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
}
public List query(String sql, RowMapper rowMapper)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object query(PreparedStatementCreator psc, ResultSetExtractor rse)
throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public void query(PreparedStatementCreator psc, RowCallbackHandler rch)
throws DataAccessException {
// TODO Auto-generated method stub
}
public List query(PreparedStatementCreator psc, RowMapper rowMapper)
throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public Object query(String sql, PreparedStatementSetter pss,
ResultSetExtractor rse) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object query(String sql, Object[] args, ResultSetExtractor rse)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public void query(String sql, PreparedStatementSetter pss,
RowCallbackHandler rch) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
}
public void query(String sql, Object[] args, RowCallbackHandler rch)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
}
public List query(String sql, PreparedStatementSetter pss,
RowMapper rowMapper) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List query(String sql, Object[] args, RowMapper rowMapper)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object query(String sql, Object[] args, int[] argTypes,
ResultSetExtractor rse) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public void query(String sql, Object[] args, int[] argTypes,
RowCallbackHandler rch) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
}
public List query(String sql, Object[] args, int[] argTypes,
RowMapper rowMapper) throws DataAccessException {
// TODO Auto-generated method stub
return null;
}
public int queryForInt(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public int queryForInt(String sql, Object[] args)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public int queryForInt(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public List queryForList(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List queryForList(String sql, Class elementType)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List queryForList(String sql, Object[] args)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List queryForList(String sql, Object[] args, Class elementType)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List queryForList(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public List queryForList(String sql, Object[] args, int[] argTypes,
Class elementType) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public long queryForLong(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public long queryForLong(String sql, Object[] args)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public long queryForLong(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public Map queryForMap(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Map queryForMap(String sql, Object[] args)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Map queryForMap(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, RowMapper rowMapper)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, Class requiredType)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, Object[] args, Class requiredType)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, Object[] args, int[] argTypes,
RowMapper rowMapper) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public Object queryForObject(String sql, Object[] args, int[] argTypes,
Class requiredType) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public SqlRowSet queryForRowSet(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public SqlRowSet queryForRowSet(String sql, Object[] args)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public int update(String sql) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public int update(PreparedStatementCreator psc) throws DataAccessException {
// TODO Auto-generated method stub
return 0;
}
public int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)
throws DataAccessException {
// TODO Auto-generated method stub
return 0;
}
public int update(String sql, PreparedStatementSetter pss)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public int update(String sql, Object[] args) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
public int update(String sql, Object[] args, int[] argTypes)
throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 0;
}
}

View File

@@ -1,5 +1,7 @@
package org.springframework.batch.execution.repository.dao;
import java.util.List;
import junit.framework.TestCase;
import org.easymock.MockControl;
@@ -8,6 +10,9 @@ import org.springframework.batch.core.domain.JobExecution;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepInstance;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
/**
@@ -46,6 +51,7 @@ public class SqlStepDaoPrefixTests extends TestCase {
stepDao.setStepExecutionIncrementer(stepExecutionIncrementer);
stepDao.setStepIncrementer(stepIncrementer);
stepExecution.setId(new Long(1));
stepExecution.incrementVersion();
step.setStatus(BatchStatus.STARTED);
job.addStep(step);
@@ -156,4 +162,33 @@ public class SqlStepDaoPrefixTests extends TestCase {
assertTrue(jdbcTemplate.getSqlStatement().indexOf("BATCH_STEP_EXECUTION") != -1);
}
private class MockJdbcTemplate extends JdbcTemplate {
private String sqlStatement = "";
public String getSqlStatement() {
return sqlStatement;
}
public List query(String sql, Object[] args, RowMapper rse) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return null;
}
public int update(String sql, Object[] args, int[] argTypes) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 1;
}
public int update(String sql, Object[] args) throws DataAccessException {
// TODO Auto-generated method stub
sqlStatement = sql;
return 1;
}
}
}