Remove dependency to JobExplorer in SimpleJobOperator

Resolves #4817
This commit is contained in:
Mahmoud Ben Hassine
2025-05-05 17:14:12 +02:00
parent b8c93d677e
commit 6992b79b8d
11 changed files with 42 additions and 84 deletions

View File

@@ -254,7 +254,6 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar {
beanDefinitionBuilder.addPropertyReference(JOB_REPOSITORY, JOB_REPOSITORY);
beanDefinitionBuilder.addPropertyReference(JOB_LAUNCHER, JOB_LAUNCHER);
beanDefinitionBuilder.addPropertyReference(JOB_EXPLORER, JOB_EXPLORER);
beanDefinitionBuilder.addPropertyReference(JOB_REGISTRY, JOB_REGISTRY);
// set optional properties

View File

@@ -197,7 +197,6 @@ public class DefaultBatchConfiguration implements ApplicationContextAware {
/**
* Define a job operator bean.
* @param jobRepository a job repository
* @param jobExplorer a job explorer
* @param jobRegistry a job registry
* @param jobLauncher a job launcher
* @return a job operator
@@ -205,12 +204,11 @@ public class DefaultBatchConfiguration implements ApplicationContextAware {
* @since 5.2
*/
@Bean
public JobOperator jobOperator(JobRepository jobRepository, JobExplorer jobExplorer, JobRegistry jobRegistry,
JobLauncher jobLauncher) throws BatchConfigurationException {
public JobOperator jobOperator(JobRepository jobRepository, JobRegistry jobRegistry, JobLauncher jobLauncher)
throws BatchConfigurationException {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setTransactionManager(getTransactionManager());
jobOperatorFactoryBean.setJobRepository(jobRepository);
jobOperatorFactoryBean.setJobExplorer(jobExplorer);
jobOperatorFactoryBean.setJobRegistry(jobRegistry);
jobOperatorFactoryBean.setJobLauncher(jobLauncher);
jobOperatorFactoryBean.setJobParametersConverter(getJobParametersConverter());

View File

@@ -61,8 +61,6 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
private JobRepository jobRepository;
private JobExplorer jobExplorer;
private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter();
private final ProxyFactory proxyFactory = new ProxyFactory();
@@ -72,7 +70,6 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
Assert.notNull(this.transactionManager, "TransactionManager must not be null");
Assert.notNull(this.jobLauncher, "JobLauncher must not be null");
Assert.notNull(this.jobRegistry, "JobRegistry must not be null");
Assert.notNull(this.jobExplorer, "JobExplorer must not be null");
Assert.notNull(this.jobRepository, "JobRepository must not be null");
if (this.transactionAttributeSource == null) {
Properties transactionAttributes = new Properties();
@@ -108,14 +105,6 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
this.jobRepository = jobRepository;
}
/**
* Setter for the job explorer.
* @param jobExplorer the job explorer to set
*/
public void setJobExplorer(JobExplorer jobExplorer) {
this.jobExplorer = jobExplorer;
}
/**
* Setter for the job parameters converter.
* @param jobParametersConverter the job parameters converter to set
@@ -166,7 +155,6 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
private SimpleJobOperator getTarget() throws Exception {
SimpleJobOperator simpleJobOperator = new SimpleJobOperator();
simpleJobOperator.setJobRegistry(this.jobRegistry);
simpleJobOperator.setJobExplorer(this.jobExplorer);
simpleJobOperator.setJobRepository(this.jobRepository);
simpleJobOperator.setJobLauncher(this.jobLauncher);
simpleJobOperator.setJobParametersConverter(this.jobParametersConverter);

View File

@@ -93,8 +93,6 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
private ListableJobLocator jobRegistry;
private JobExplorer jobExplorer;
private JobLauncher jobLauncher;
private JobRepository jobRepository;
@@ -112,7 +110,6 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
public void afterPropertiesSet() throws Exception {
Assert.state(jobLauncher != null, "JobLauncher must be provided");
Assert.state(jobRegistry != null, "JobLocator must be provided");
Assert.state(jobExplorer != null, "JobExplorer must be provided");
Assert.state(jobRepository != null, "JobRepository must be provided");
}
@@ -132,14 +129,6 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
this.jobRegistry = jobRegistry;
}
/**
* Public setter for the {@link JobExplorer}.
* @param jobExplorer the {@link JobExplorer} to set
*/
public void setJobExplorer(JobExplorer jobExplorer) {
this.jobExplorer = jobExplorer;
}
public void setJobRepository(JobRepository jobRepository) {
this.jobRepository = jobRepository;
}
@@ -154,12 +143,12 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
@Override
public List<Long> getExecutions(long instanceId) throws NoSuchJobInstanceException {
JobInstance jobInstance = jobExplorer.getJobInstance(instanceId);
JobInstance jobInstance = jobRepository.getJobInstance(instanceId);
if (jobInstance == null) {
throw new NoSuchJobInstanceException(String.format("No job instance with id=%d", instanceId));
}
List<Long> list = new ArrayList<>();
for (JobExecution jobExecution : jobExplorer.getJobExecutions(jobInstance)) {
for (JobExecution jobExecution : jobRepository.getJobExecutions(jobInstance)) {
list.add(jobExecution.getId());
}
return list;
@@ -173,7 +162,7 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
@Override
public List<Long> getJobInstances(String jobName, int start, int count) throws NoSuchJobException {
List<Long> list = new ArrayList<>();
List<JobInstance> jobInstances = jobExplorer.getJobInstances(jobName, start, count);
List<JobInstance> jobInstances = jobRepository.getJobInstances(jobName, start, count);
for (JobInstance jobInstance : jobInstances) {
list.add(jobInstance.getId());
}
@@ -186,7 +175,7 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
@Override
@Nullable
public JobInstance getJobInstance(String jobName, JobParameters jobParameters) {
return this.jobExplorer.getJobInstance(jobName, jobParameters);
return this.jobRepository.getJobInstance(jobName, jobParameters);
}
@Override
@@ -201,7 +190,7 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
@Override
public Set<Long> getRunningExecutions(String jobName) throws NoSuchJobException {
Set<Long> set = new LinkedHashSet<>();
for (JobExecution jobExecution : jobExplorer.findRunningJobExecutions(jobName)) {
for (JobExecution jobExecution : jobRepository.findRunningJobExecutions(jobName)) {
set.add(jobExecution.getId());
}
if (set.isEmpty() && !jobRegistry.getJobNames().contains(jobName)) {
@@ -299,7 +288,7 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
}
Job job = jobRegistry.getJob(jobName);
JobParameters parameters = new JobParametersBuilder(jobExplorer).getNextJobParameters(job).toJobParameters();
JobParameters parameters = new JobParametersBuilder(jobRepository).getNextJobParameters(job).toJobParameters();
if (logger.isInfoEnabled()) {
logger.info(String.format("Attempting to launch job with name=%s and parameters=%s", jobName, parameters));
}
@@ -389,7 +378,7 @@ public class SimpleJobOperator implements JobOperator, InitializingBean {
}
private JobExecution findExecutionById(long executionId) throws NoSuchJobExecutionException {
JobExecution jobExecution = jobExplorer.getJobExecution(executionId);
JobExecution jobExecution = jobRepository.getJobExecution(executionId);
if (jobExecution == null) {
throw new NoSuchJobExecutionException("No JobExecution found for id: [" + executionId + "]");

View File

@@ -57,7 +57,6 @@ class JobOperatorFactoryBeanTests {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setTransactionManager(this.transactionManager);
jobOperatorFactoryBean.setJobLauncher(this.jobLauncher);
jobOperatorFactoryBean.setJobExplorer(this.jobExplorer);
jobOperatorFactoryBean.setJobRegistry(this.jobRegistry);
jobOperatorFactoryBean.setJobRepository(this.jobRepository);
jobOperatorFactoryBean.setJobParametersConverter(this.jobParametersConverter);
@@ -80,7 +79,6 @@ class JobOperatorFactoryBeanTests {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setTransactionManager(this.transactionManager);
jobOperatorFactoryBean.setJobLauncher(this.jobLauncher);
jobOperatorFactoryBean.setJobExplorer(this.jobExplorer);
jobOperatorFactoryBean.setJobRegistry(this.jobRegistry);
jobOperatorFactoryBean.setJobRepository(this.jobRepository);
jobOperatorFactoryBean.setJobParametersConverter(this.jobParametersConverter);

View File

@@ -79,8 +79,6 @@ class SimpleJobOperatorTests {
protected Job job;
private JobExplorer jobExplorer;
private JobRepository jobRepository;
private JobParameters jobParameters;
@@ -120,10 +118,6 @@ class SimpleJobOperatorTests {
jobOperator.setJobLauncher(
(job, jobParameters) -> new JobExecution(new JobInstance(123L, job.getName()), 999L, jobParameters));
jobExplorer = mock();
jobOperator.setJobExplorer(jobExplorer);
jobRepository = mock();
jobOperator.setJobRepository(jobRepository);
@@ -159,8 +153,8 @@ class SimpleJobOperatorTests {
void testStartNextInstanceSunnyDay() throws Exception {
jobParameters = new JobParameters();
JobInstance jobInstance = new JobInstance(321L, "foo");
when(jobExplorer.getJobInstances("foo", 0, 1)).thenReturn(Collections.singletonList(jobInstance));
when(jobExplorer.getJobExecutions(jobInstance))
when(jobRepository.getJobInstances("foo", 0, 1)).thenReturn(Collections.singletonList(jobInstance));
when(jobRepository.getJobExecutions(jobInstance))
.thenReturn(Collections.singletonList(new JobExecution(jobInstance, new JobParameters())));
Long value = jobOperator.startNextInstance("foo");
assertEquals(999, value.longValue());
@@ -190,9 +184,9 @@ class SimpleJobOperatorTests {
@Test
void testResumeSunnyDay() throws Exception {
jobParameters = new JobParameters();
when(jobExplorer.getJobExecution(111L))
when(jobRepository.getJobExecution(111L))
.thenReturn(new JobExecution(new JobInstance(123L, job.getName()), 111L, jobParameters));
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
Long value = jobOperator.restart(111L);
assertEquals(999, value.longValue());
}
@@ -201,8 +195,8 @@ class SimpleJobOperatorTests {
void testGetSummarySunnyDay() throws Exception {
jobParameters = new JobParameters();
JobExecution jobExecution = new JobExecution(new JobInstance(123L, job.getName()), 111L, jobParameters);
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
jobExplorer.getJobExecution(111L);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
jobRepository.getJobExecution(111L);
String value = jobOperator.getSummary(111L);
assertEquals(jobExecution.toString(), value);
}
@@ -210,7 +204,7 @@ class SimpleJobOperatorTests {
@Test
void testGetSummaryNoSuchExecution() {
jobParameters = new JobParameters();
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
assertThrows(NoSuchJobExecutionException.class, () -> jobOperator.getSummary(111L));
}
@@ -222,7 +216,7 @@ class SimpleJobOperatorTests {
jobExecution.createStepExecution("step1");
jobExecution.createStepExecution("step2");
jobExecution.getStepExecutions().iterator().next().setId(21L);
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
Map<Long, String> value = jobOperator.getStepExecutionSummaries(111L);
assertEquals(2, value.size());
}
@@ -230,7 +224,7 @@ class SimpleJobOperatorTests {
@Test
void testGetStepExecutionSummariesNoSuchExecution() {
jobParameters = new JobParameters();
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
assertThrows(NoSuchJobExecutionException.class, () -> jobOperator.getStepExecutionSummaries(111L));
}
@@ -238,7 +232,7 @@ class SimpleJobOperatorTests {
void testFindRunningExecutionsSunnyDay() throws Exception {
jobParameters = new JobParameters();
JobExecution jobExecution = new JobExecution(new JobInstance(123L, job.getName()), 111L, jobParameters);
when(jobExplorer.findRunningJobExecutions("foo")).thenReturn(Collections.singleton(jobExecution));
when(jobRepository.findRunningJobExecutions("foo")).thenReturn(Collections.singleton(jobExecution));
Set<Long> value = jobOperator.getRunningExecutions("foo");
assertEquals(111L, value.iterator().next().longValue());
}
@@ -247,14 +241,14 @@ class SimpleJobOperatorTests {
@SuppressWarnings("unchecked")
void testFindRunningExecutionsNoSuchJob() {
jobParameters = new JobParameters();
when(jobExplorer.findRunningJobExecutions("no-such-job")).thenReturn(Collections.EMPTY_SET);
when(jobRepository.findRunningJobExecutions("no-such-job")).thenReturn(Collections.EMPTY_SET);
assertThrows(NoSuchJobException.class, () -> jobOperator.getRunningExecutions("no-such-job"));
}
@Test
void testGetJobParametersSunnyDay() throws Exception {
final JobParameters jobParameters = new JobParameters();
when(jobExplorer.getJobExecution(111L))
when(jobRepository.getJobExecution(111L))
.thenReturn(new JobExecution(new JobInstance(123L, job.getName()), 111L, jobParameters));
String value = jobOperator.getParameters(111L);
assertEquals("a=b", value);
@@ -262,7 +256,7 @@ class SimpleJobOperatorTests {
@Test
void testGetJobParametersNoSuchExecution() {
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
assertThrows(NoSuchJobExecutionException.class, () -> jobOperator.getParameters(111L));
}
@@ -270,8 +264,8 @@ class SimpleJobOperatorTests {
void testGetLastInstancesSunnyDay() throws Exception {
jobParameters = new JobParameters();
JobInstance jobInstance = new JobInstance(123L, job.getName());
when(jobExplorer.getJobInstances("foo", 0, 2)).thenReturn(Collections.singletonList(jobInstance));
jobExplorer.getJobInstances("foo", 0, 2);
when(jobRepository.getJobInstances("foo", 0, 2)).thenReturn(Collections.singletonList(jobInstance));
jobRepository.getJobInstances("foo", 0, 2);
List<Long> value = jobOperator.getJobInstances("foo", 0, 2);
assertEquals(123L, value.get(0).longValue());
}
@@ -279,7 +273,7 @@ class SimpleJobOperatorTests {
@Test
void testGetLastInstancesNoSuchJob() {
jobParameters = new JobParameters();
jobExplorer.getJobInstances("no-such-job", 0, 2);
jobRepository.getJobInstances("no-such-job", 0, 2);
assertThrows(NoSuchJobException.class, () -> jobOperator.getJobInstances("no-such-job", 0, 2));
}
@@ -291,11 +285,11 @@ class SimpleJobOperatorTests {
JobInstance jobInstance = mock();
// when
when(this.jobExplorer.getJobInstance(jobName, jobParameters)).thenReturn(jobInstance);
when(this.jobRepository.getJobInstance(jobName, jobParameters)).thenReturn(jobInstance);
JobInstance actualJobInstance = this.jobOperator.getJobInstance(jobName, jobParameters);
// then
verify(this.jobExplorer).getJobInstance(jobName, jobParameters);
verify(this.jobRepository).getJobInstance(jobName, jobParameters);
assertEquals(jobInstance, actualJobInstance);
}
@@ -309,17 +303,17 @@ class SimpleJobOperatorTests {
@Test
void testGetExecutionsSunnyDay() throws Exception {
JobInstance jobInstance = new JobInstance(123L, job.getName());
when(jobExplorer.getJobInstance(123L)).thenReturn(jobInstance);
when(jobRepository.getJobInstance(123L)).thenReturn(jobInstance);
JobExecution jobExecution = new JobExecution(jobInstance, 111L, jobParameters);
when(jobExplorer.getJobExecutions(jobInstance)).thenReturn(Collections.singletonList(jobExecution));
when(jobRepository.getJobExecutions(jobInstance)).thenReturn(Collections.singletonList(jobExecution));
List<Long> value = jobOperator.getExecutions(123L);
assertEquals(111L, value.iterator().next().longValue());
}
@Test
void testGetExecutionsNoSuchInstance() {
jobExplorer.getJobInstance(123L);
jobRepository.getJobInstance(123L);
assertThrows(NoSuchJobInstanceException.class, () -> jobOperator.getExecutions(123L));
}
@@ -327,8 +321,8 @@ class SimpleJobOperatorTests {
void testStop() throws Exception {
JobInstance jobInstance = new JobInstance(123L, job.getName());
JobExecution jobExecution = new JobExecution(jobInstance, 111L, jobParameters);
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
jobExplorer.getJobExecution(111L);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
jobRepository.getJobExecution(111L);
jobRepository.update(jobExecution);
jobOperator.stop(111L);
assertEquals(BatchStatus.STOPPING, jobExecution.getStatus());
@@ -350,10 +344,10 @@ class SimpleJobOperatorTests {
when(step.getTasklet()).thenReturn(tasklet);
when(step.getName()).thenReturn("test_job.step1");
when(jobRegistry.getJob(any(String.class))).thenReturn(job);
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
jobOperator.setJobRegistry(jobRegistry);
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
jobRepository.update(jobExecution);
jobOperator.stop(111L);
assertEquals(BatchStatus.STOPPING, jobExecution.getStatus());
@@ -369,7 +363,7 @@ class SimpleJobOperatorTests {
when(step.getTasklet()).thenReturn(tasklet);
when(jobRegistry.getJob(job.getName())).thenThrow(new NoSuchJobException("Unable to find job"));
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
jobOperator.setJobRegistry(jobRegistry);
jobOperator.stop(111L);
@@ -405,10 +399,10 @@ class SimpleJobOperatorTests {
when(step.getTasklet()).thenReturn(tasklet);
when(step.getName()).thenReturn("test_job.step1");
when(jobRegistry.getJob(any(String.class))).thenReturn(job);
when(jobExplorer.getJobExecution(111L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(111L)).thenReturn(jobExecution);
jobOperator.setJobRegistry(jobRegistry);
jobExplorer.getJobExecution(111L);
jobRepository.getJobExecution(111L);
jobRepository.update(jobExecution);
jobOperator.stop(111L);
assertEquals(BatchStatus.STOPPING, jobExecution.getStatus());
@@ -419,7 +413,7 @@ class SimpleJobOperatorTests {
JobInstance jobInstance = new JobInstance(123L, job.getName());
JobExecution jobExecution = new JobExecution(jobInstance, 111L, jobParameters);
jobExecution.setStatus(BatchStatus.STOPPING);
when(jobExplorer.getJobExecution(123L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(123L)).thenReturn(jobExecution);
jobRepository.update(jobExecution);
jobOperator.abandon(123L);
assertEquals(BatchStatus.ABANDONED, jobExecution.getStatus());
@@ -431,7 +425,7 @@ class SimpleJobOperatorTests {
JobInstance jobInstance = new JobInstance(123L, job.getName());
JobExecution jobExecution = new JobExecution(jobInstance, 111L, jobParameters);
jobExecution.setStatus(BatchStatus.STARTED);
when(jobExplorer.getJobExecution(123L)).thenReturn(jobExecution);
when(jobRepository.getJobExecution(123L)).thenReturn(jobExecution);
jobRepository.update(jobExecution);
assertThrows(JobExecutionAlreadyRunningException.class, () -> jobOperator.abandon(123L));
}

View File

@@ -58,7 +58,6 @@
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator">
<property name="jobLauncher" ref="jobLauncher"/>
<property name="jobRepository" ref="jobRepository"/>
<property name="jobExplorer" ref="jobExplorer"/>
<property name="jobRegistry" ref="jobRegistry"/>
</bean>

View File

@@ -21,8 +21,7 @@
<bean id="jobOperator"
class="org.springframework.batch.core.launch.support.SimpleJobOperator"
p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"
p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
p:jobLauncher-ref="jobLauncher" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
<bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"

View File

@@ -19,10 +19,6 @@
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"/>
<bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"/>
<bean id="jobRegistry"
class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
@@ -53,7 +49,6 @@
<bean id="notificationPublisher" class="org.springframework.batch.samples.misc.jmx.JobExecutionNotificationPublisher" />
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator">
<property name="jobExplorer" ref="jobExplorer"/>
<property name="jobRepository" ref="jobRepository" />
<property name="jobRegistry" ref="jobRegistry" />
<property name="jobLauncher">

View File

@@ -14,7 +14,7 @@
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" />
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator" p:jobLauncher-ref="jobLauncher"
p:jobExplorer-ref="jobExplorer" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
<bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"/>

View File

@@ -21,8 +21,7 @@
<bean id="jobOperator"
class="org.springframework.batch.core.launch.support.SimpleJobOperator"
p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"
p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
p:jobLauncher-ref="jobLauncher" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
<bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"