Bonjour,

J'ai un répertoire dans lequel arrivent régulièrement des fichiers à charger avec Spring Batch.
Si l'un de ces fichiers produit une erreur, j'aimerais que les autres fichiers continuent d'être chargés, et,
qu'après correction, le chargement du fichier en erreur puisse reprendre à l'endroit où il s'est arrêté.

Mon problème :

- si j'utilise ".incrementer(new RunIdIncrementer())" dans le Job,
un nouveau job est créé à chaque execution du projet Spring.
Par conséquent, si un chargement de fichier plante, le chargement reprend depuis le début du fichier mais pas au niveau de l'erreur.

- si je n'utilise pas ".incrementer(new RunIdIncrementer())" dans le Job,
ça marche, la reprise se fait bien mais une fois le chargement terminé, si j'ajoute des nouveaux fichiers à charger, ils ne sont pas consommés car il n'y a pas de nouveau job créé.

J'ai cru comprendre qu'il fallait utiliser ".incrementer(new RunIdIncrementer())" dans le job
afin de pouvoir lire les nouveaux fichiers déposés, et, que si l'on voulait faire une reprise, il fallait rappeler le ou les Jobs en erreur.
Exact ?

Si oui, il faut pour cela que Spring Batch :

- aille lire la table BATCH_JOB_EXECUTION pour indentifier les jobs où "status=FAILED"
- change pour chacun des job FAILED leur date de fin pour pouvoir les relancer

J'ai trouvé ce bout de code qui fait presque l'affaire :
(ne reste plus qu'à filtrer avec "status=FAILED")

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
List<String> jobs = jobExplorer.getJobNames();
for (String job : jobs) {
 
Set<JobExecution> runningJobs = jobExplorer.findRunningJobExecutions(job);
 
            for (JobExecution runningJob : runningJobs) 
	    {
                runningJob.setEndTime(new Date());
                jobRepository.update(runningJob);
                jobOperator.restart(runningJob.getId());
		LOGGER.info("Job restarted: " + runningJob);
            }
        }
Les objets utilisés ci-dessus "jobRepository", "jobOperator", "jobExplorer"... sont censés être créés par l'annotation @EnableBatchProcessing
donc ce code est à utiliser dans une JobDefinition. J'en déduis donc que ce bout de code sera appelé à chaque exécution de mon appli Spring Batch.

Par contre, comment créer les instances jobExplorer, jobRepository et jobOperator pour pouvoir les utiliser dans mon bout de code ?