BATCH-453: Added stop support to SimpleJobOperator and generated correct sql for remaining schema files.

This commit is contained in:
lucasward
2008-08-26 03:53:41 +00:00
parent c0c8331227
commit f81604e439
12 changed files with 94 additions and 108 deletions

View File

@@ -44,7 +44,7 @@ public interface JobExplorer {
/**
* @param executionId
* @return the {@link JobExecution} with this id, or null
* @return the {@link JobExecution} with this id, or null if not found
*/
JobExecution getJobExecution(Long executionId);

View File

@@ -25,6 +25,7 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
@@ -45,6 +46,7 @@ import org.springframework.batch.core.launch.NoSuchJobExecutionException;
import org.springframework.batch.core.launch.NoSuchJobInstanceException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.support.PropertiesConverter;
import org.springframework.beans.factory.InitializingBean;
@@ -52,6 +54,7 @@ import org.springframework.util.Assert;
/**
* @author Dave Syer
* @author Lucas Ward
*
*/
public class SimpleJobOperator implements JobOperator, InitializingBean {
@@ -67,6 +70,8 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
private JobExplorer jobExplorer;
private JobLauncher jobLauncher;
private JobRepository jobRepository;
private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter();
@@ -106,6 +111,10 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
public void setJobExplorer(JobExplorer jobExplorer) {
this.jobExplorer = jobExplorer;
}
public void setJobRepository(JobRepository jobRepository) {
this.jobRepository = jobRepository;
}
/**
* Public setter for the {@link JobLauncher}.
@@ -356,7 +365,20 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
* org.springframework.batch.core.launch.JobOperator#stop(java.lang.Long)
*/
public boolean stop(long executionId) throws NoSuchJobExecutionException {
throw new UnsupportedOperationException("See BATCH-453 for implementation.");
JobExecution jobExecution = jobExplorer.getJobExecution(executionId);
if(jobExecution == null){
throw new NoSuchJobExecutionException("No JobExecution found for id: [" + executionId + "]");
}
//Indicate the execution should be stopped by setting it's status to 'STOPPING'. It is assumed that
//the step implementation will check this status at chunk boundaries.
jobExecution.setStatus(BatchStatus.STOPPING);
jobRepository.update(jobExecution);
// TODO: I'm not sure that we can really know if the execution stopped
return true;
}
}

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL BLOB
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY ,
OBJECT_VAL BLOB NOT NULL
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL BLOB
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
OBJECT_VAL BLOB NOT NULL
) ;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, DUMMY VARCHAR(1));

View File

@@ -27,8 +27,8 @@ CREATE TABLE BATCH_JOB_EXECUTION (
STATUS VARCHAR(10) ,
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,22 +60,15 @@ CREATE TABLE BATCH_STEP_EXECUTION (
ROLLBACK_COUNT BIGINT ,
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL LONGVARBINARY
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY ,
OBJECT_VAL LONGVARBINARY NOT NULL
) ;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED DATETIME,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) type=InnoDB;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED DATETIME,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) type=InnoDB;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL DATETIME DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL BLOB
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY ,
OBJECT_VAL BLOB NOT NULL
) type=InnoDB;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT NOT NULL) type=MYISAM;

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR2(20) ,
EXIT_MESSAGE VARCHAR2(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR2(20) ,
EXIT_MESSAGE VARCHAR2(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID NUMBER(38) NOT NULL,
DISCRIMINATOR VARCHAR2(1) NOT NULL,
TYPE_CD VARCHAR2(6) NOT NULL,
KEY_NAME VARCHAR2(1000) NOT NULL,
STRING_VAL VARCHAR2(1000) ,
DATE_VAL TIMESTAMP DEFAULT NULL,
LONG_VAL NUMBER(38) ,
DOUBLE_VAL NUMBER ,
OBJECT_VAL BLOB
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID NUMBER(38) NOT NULL PRIMARY KEY ,
OBJECT_VAL BLOB NOT NULL
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL TIMESTAMP DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL BYTEA
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY ,
OBJECT_VAL BYTEA NOT NULL
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED DATETIME,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED DATETIME,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) ,
DATE_VAL DATETIME DEFAULT NULL,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
OBJECT_VAL IMAGE
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY ,
OBJECT_VAL IMAGE NOT NULL
) ;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT IDENTITY);

View File

@@ -28,6 +28,7 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) NULL,
EXIT_CODE VARCHAR(20) NULL,
EXIT_MESSAGE VARCHAR(2500) NULL,
LAST_UPDATED DATETIME,
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
@@ -60,20 +61,14 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) NULL,
EXIT_CODE VARCHAR(20) NULL,
EXIT_MESSAGE VARCHAR(2500) NULL,
LAST_UPDATED DATETIME,
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE TABLE BATCH_EXECUTION_CONTEXT (
EXECUTION_ID BIGINT NOT NULL,
DISCRIMINATOR VARCHAR(1) NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(1000) NOT NULL,
STRING_VAL VARCHAR(1000) NULL,
DATE_VAL DATETIME DEFAULT NULL,
LONG_VAL BIGINT NULL,
DOUBLE_VAL DOUBLE PRECISION NULL,
OBJECT_VAL IMAGE NULL
CREATE TABLE BATCH_MAP_STORE (
MAP_STORE_ID BIGINT NOT NULL PRIMARY KEY ,
OBJECT_VAL IMAGE NOT NULL
) ;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT IDENTITY);

View File

@@ -7,7 +7,7 @@ CREATE TABLE BATCH_JOB_INSTANCE (
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID ${BIGINT} $!{IDENTITY} NOT NULL PRIMARY KEY $!{GENERATED},
VERSION ${BIGINT} $!{NULL},
VERSION ${BIGINT} $!{NULL},
JOB_INSTANCE_ID ${BIGINT} NOT NULL,
CREATE_TIME ${TIMESTAMP} NOT NULL,
START_TIME ${TIMESTAMP} DEFAULT NULL $!{NULL},
@@ -16,12 +16,9 @@ CREATE TABLE BATCH_JOB_EXECUTION (
CONTINUABLE CHAR(1) $!{NULL},
EXIT_CODE ${VARCHAR}(20) $!{NULL},
EXIT_MESSAGE ${VARCHAR}(2500) $!{NULL},
EXECUTION_CONTEXT ${CLOB} $!{NULL},
MAP_STORE_ID ${BIGINT} $!{NULL},
LAST_UPDATED ${TIMESTAMP},
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID),
constraint MAP_JOB_EXEC_FK foreign key (MAP_STORE_ID)
references BATCH_MAP_STORE(MAP_STORE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) $!{VOODOO};
CREATE TABLE BATCH_JOB_PARAMS (
@@ -52,10 +49,7 @@ CREATE TABLE BATCH_STEP_EXECUTION (
CONTINUABLE CHAR(1) $!{NULL},
EXIT_CODE ${VARCHAR}(20) $!{NULL},
EXIT_MESSAGE ${VARCHAR}(2500) $!{NULL},
EXECUTION_CONTEXT ${CLOB} $!{NULL},
MAP_STORE_ID ${BIGINT} $!{NULL},
LAST_UPDATED ${TIMESTAMP},
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID),
constraint MAP_STEP_EXEC_FK foreign key (MAP_STORE_ID)
references BATCH_MAP_STORE(MAP_STORE_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) $!{VOODOO};

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.launch.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.easymock.EasyMock.*;
import java.util.Arrays;
import java.util.Collection;
@@ -30,6 +31,7 @@ import java.util.Set;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
@@ -46,6 +48,7 @@ import org.springframework.batch.core.launch.NoSuchJobExecutionException;
import org.springframework.batch.core.launch.NoSuchJobInstanceException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.core.step.StepSupport;
import org.springframework.batch.support.PropertiesConverter;
@@ -61,6 +64,8 @@ public class SimpleJobOperatorTests {
protected Job job;
private JobExplorer jobExplorer;
private JobRepository jobRepository;
private JobParameters jobParameters;
@@ -108,6 +113,9 @@ public class SimpleJobOperatorTests {
jobExplorer = EasyMock.createNiceMock(JobExplorer.class);
jobOperator.setJobExplorer(jobExplorer);
jobRepository = createMock(JobRepository.class);
jobOperator.setJobRepository(jobRepository);
jobOperator.setJobParametersConverter(new DefaultJobParametersConverter() {
@Override
@@ -138,17 +146,6 @@ public class SimpleJobOperatorTests {
}
}
@Test
public void testStop() throws Exception {
try {
jobOperator.stop(123L);
fail("Expected UnsupportedOperationException");
}
catch (UnsupportedOperationException e) {
// expected
}
}
/**
* Test method for
* {@link org.springframework.batch.core.launch.support.SimpleJobOperator#startNextInstance(java.lang.String)}
@@ -378,5 +375,20 @@ public class SimpleJobOperatorTests {
}
EasyMock.verify(jobExplorer);
}
@Test
public void testStop() throws Exception{
JobInstance jobInstance = new JobInstance(123L, jobParameters, job.getName());
JobExecution jobExecution = new JobExecution(jobInstance, 111L);
jobExplorer.getJobExecution(111L);
expectLastCall().andReturn(jobExecution);
jobRepository.update(jobExecution);
replay(jobExplorer);
replay(jobRepository);
jobOperator.stop(111L);
verify(jobExplorer);
verify(jobRepository);
assertEquals(BatchStatus.STOPPING, jobExecution.getStatus());
}
}