J'ai un projet de lot de printemps existant qui lit des données de MySQL ou ArangoDB (base de données NoSql) basé sur la décision de basculement de fonctionnalité au démarrage et fait un peu de traitement et réécrit à MySQL/ArangoDB.Printemps Lots multiples lecteurs pour différents DB
Maintenant, la configuration du lecteur pour MySQL est quelque chose comme ci-dessous,
@Bean
@Primary
@StepScope
public HibernatePagingItemReader reader(
@Value("#{jobParameters[oldMetadataDefinitionId]}") Long oldMetadataDefinitionId) {
Map<String, Object> queryParameters = new HashMap<>();
queryParameters.put(Constants.OLD_METADATA_DEFINITION_ID, oldMetadataDefinitionId);
HibernatePagingItemReader<Long> reader = new HibernatePagingItemReader<>();
reader.setUseStatelessSession(false);
reader.setPageSize(250);
reader.setParameterValues(queryParameters);
reader.setSessionFactory(((HibernateEntityManagerFactory) entityManagerFactory.getObject()).getSessionFactory());
return reader;
}
et j'ai un autre lecteur de Arango comme ci-dessous,
@Bean
@StepScope
public ListItemReader arangoReader(
@Value("#{jobParameters[oldMetadataDefinitionId]}") Long oldMetadataDefinitionId) {
List<InstanceDTO> instanceList = new ArrayList<InstanceDTO>();
PersistenceService arangoPersistence = arangoConfiguration
.getPersistenceService());
List<Long> instanceIds = arangoPersistence.getDefinitionInstanceIds(oldMetadataDefinitionId);
instanceIds.forEach((instanceId) ->
{
InstanceDTO instanceDto = new InstanceDTO();
instanceDto.setDefinitionID(oldMetadataDefinitionId);
instanceDto.setInstanceID(instanceId);
instanceList.add(instanceDto);
});
return new ListItemReader(instanceList);
}
et ma configuration étape est inférieure,
@Bean
@SuppressWarnings("unchecked")
public Step InstanceMergeStep(ListItemReader arangoReader, ItemWriter<MetadataInstanceDTO> arangoWriter,
ItemReader<Long> mysqlReader, ItemWriter<Long> mysqlWriter) {
Step step = null;
if (arangoUsage) {
step = steps.get("arangoInstanceMergeStep")
.<Long, Long>chunk(1)
.reader(arangoReader)
.writer(arangoWriter)
.faultTolerant()
.skip(Exception.class)
.skipLimit(10)
.taskExecutor(stepTaskExecutor())
.build();
((TaskletStep) step).registerChunkListener(chunkListener);
}
else {
step = steps.get("mysqlInstanceMergeStep")
.<Long, Long>chunk(1)
.reader(mysqlReader)
.writer(mysqlWriter)
.faultTolerant()
.skip(Exception.class)
.skipLimit(failedSkipLimit)
.taskExecutor(stepTaskExecutor())
.build();
((TaskletStep) step).registerChunkListener(chunkListener);
}
return step;
}
Le lecteur MySQL prend en charge la pagination via HibernatePagingItemReader afin qu'il soit géré e millions d'articles sans aucun problème de mémoire.
Je veux implémenter le même support de pagination pour qu'arango reader ne récupère que 250 documents par itération comment modifier le code du lecteur d'arango pour y arriver?
Merci @sabir pour la clarification ci-dessus !! , sera-t-il possible d'appeler le lecteur plusieurs fois de arangoMergeStep avec startIndex dynamique et endIndex pour récupérer seulement des enregistrements limités pour les requêtes AQL en utilisant spring boot. – siva
C'est la méthode 'read()' du lecteur qui sera appelée plusieurs fois par framework. Cette méthode 'read()' devrait continuer à renvoyer un à un les éléments jusqu'à ce qu'une page soit terminée, puis récupérer la page suivante. vous renvoyez "null" pour le dernier élément de la dernière page.Regardez l'une des classes existantes comme - 'JdbcPagingItemReader' ou' HibernatePagingItemReader' etc. Le travail de votre lecteur personnalisé sera de maintenir ces éléments et comptes puisque le contrat est de renvoyer un seul élément chaque fois qu'une lecture est appelée. –