web-dev-qa-db-fra.com

Comment fonctionne la portée de l'étape du lot de printemps

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;
}
16
lakshmi kanth

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).

38
Naros