Comment java-configurer des sources de données séparées pour les données de lot de printemps et les données d'entreprise? Devrais-je même le faire?
mon emploi principal ne fait que les opérations de lecture et l'autre un peu de l'écriture, mais sur le moteur MyISAM qui ignore les transactions, donc je n'aurais pas besoin nécessairement de transaction de l'aide... Comment puis-je configurer Spring Batch pour avoir sa propre source de données pour la JobRepository, distinct de celui qui le tient les données de l'entreprise? La première source de données-configuration se fait comme suit:
@Configuration
public class StandaloneInfrastructureConfiguration {
@Autowired
Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "org.podcastpedia.batch.*" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalJpaProperties());
return em;
}
Properties additionalJpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "none");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.setProperty("hibernate.show_sql", "true");
return properties;
}
@Bean
public DataSource dataSource(){
return DataSourceBuilder.create()
.url(env.getProperty("db.url"))
.driverClassName(env.getProperty("db.driver"))
.username(env.getProperty("db.username"))
.password(env.getProperty("db.password"))
.build();
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
et puis il est importé dans la configuration de la Tâche de la classe où le @EnableBatchProcessing
annotation automatiquement l'utilise. Ma première pensée a été d'essayer de définir la configuration de la classe de prolonger la DefaultBatchConfigurer
mais puis-je obtenir un BeanCurrentlyInCreationException
( org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name jobBuilders: Requested bean is currently in creation: Is there an unresolvable circular reference?
):
@Configuration
@EnableBatchProcessing
@Import({StandaloneInfrastructureConfiguration.class, NotifySubscribersServicesConfiguration.class})
public class NotifySubscribersJobConfiguration extends DefaultBatchConfigurer {
@Autowired
private JobBuilderFactory jobBuilders;
@Autowired
private StepBuilderFactory stepBuilders;
@Autowired
private DataSource dataSource;
@Autowired
Environment env;
@Override
@Autowired
public void setDataSource(javax.sql.DataSource dataSource) {
super.setDataSource(batchDataSource());
}
private DataSource batchDataSource(){
return DataSourceBuilder.create()
.url(env.getProperty("batchdb.url"))
.driverClassName(env.getProperty("batchdb.driver"))
.username(env.getProperty("batchdb.username"))
.password(env.getProperty("batchdb.password"))
.build();
}
@Bean
public ItemReader<User> notifySubscribersReader(){
JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<User>();
String sql = "select * from users where is_email_subscriber is not null";
reader.setSql(sql);
reader.setDataSource(dataSource);
reader.setRowMapper(rowMapper());
return reader;
}
........
}
Toutes les pensées sont plus que bienvenues. Le projet est disponible sur GitHub - https://github.com/podcastpedia/podcastpedia-batch
Merci beaucoup.
source d'informationauteur amacoder
Vous devez vous connecter pour publier un commentaire.
Ok, c'est étrange, mais ça fonctionne. Déplacer les sources de données pour son propre classe de configuration fonctionne très bien et on est capable de autowire.
L'exemple est un multi-source de données de la version de Spring Batch Exemple D'Un Service De:
DataSourceConfiguration:
BatchConfiguration:
Avez-vous essayé quelque chose comme ça déjà?
puis marquez l'autre source de données avec un @Principale, et utiliser un @Qualifier votre lot de config pour spécifier que vous souhaitez auotwire la batchDataSource bean.
Par https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources:
Dans les propriétés de l'application, vous pouvez utiliser les propriétés datasource:
En supposant que vous avez 2 sources de données, une pour le printemps lot de métadonnées telles que les détails de la tâche[permet de dire CONFIGDB] et d'autres données en entreprise [disons base de données d'applications]:
Injecter CONFIGDB en jobRepository, comme ceci:
Maintenant, vous pouvez injecter de la base de données d'applications dartasource dans votre DAO OU Écrivains si tout comme..
OU
vous pouvez définir une ressource et Injecter cette base de données d'applications avec recherche jndi dans la classe où son besoin comme:
}