J'ai une exigence où j'ai besoin de traiter des fichiers en fonction de l'appel de repos dans lequel j'obtiens le nom du fichier, je l'ajoute au paramètre du travail et je l'utilise lors de la création des beans.
Je crée des beans d'étendue d'étape pour (lecteur, écrivain) et j'utilise le paramètre du travail.Je démarre le travail dans un nouveau thread car j'utilise un excuteur de tâches asynchrones pour lancer le travail et ma question est de savoir comment les beans seront créés d'ici le printemps quand on définit @StepScope
jobParametersBuilder.addString("fileName", request.getFileName());
jobExecution = jobLauncher.run(job, jobParametersBuilder.toJobParameters());
@Bean
public JobLauncher jobLauncher() {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository());
jobLauncher.setTaskExecutor(asyncTaskExecutor());
return jobLauncher;
}
@Bean
@StepScope
public ItemWriter<Object> writer(@Value ("#{jobParameters['fileName']}"String fileName) {
JdbcBatchItemWriter<Object> writer = new JdbcBatchItemWriter<>();
writer.setItemSqlParameterSourceProvider(
new BeanPropertyItemSqlParameterSourceProvider<Object>());
writer.setSql(queryCollection.getquery());
writer.setDataSource(dataSource(fileName));
return writer;
}
Un objet batch de printemps StepScope
est un objet unique à une étape spécifique et non à un singleton. Comme vous le savez probablement, la portée par défaut du bean dans Spring est un singleton. Mais en spécifiant un composant de lot de ressort étant StepScope
signifie que Spring Batch utilisera le conteneur de ressort pour instancier une nouvelle instance de ce composant pour chaque exécution d'étape.
Ceci est souvent utile pour effectuer une liaison tardive de paramètre où un paramètre peut être spécifié au niveau StepContext
ou JobExecutionContext
et doit être remplacé par un espace réservé, tout comme votre exemple avec l'exigence de nom de fichier .
Une autre raison utile d'utiliser StepScope
est lorsque vous décidez de réutiliser le même composant en étapes parallèles. Si le composant gère un état interne, il est important qu'il soit basé sur StepScope
afin qu'un thread n'altère pas l'état géré par un autre thread (par exemple, chaque thread d'une étape donnée a sa propre instance de StepScope
composant).