Wie java-konfigurieren Sie separate Datenquellen für spring-batch-Daten und business-Daten? Sollte ich es überhaupt tun?
mein Haupt-job nicht nur lese-Operationen und die andere etwas schreiben, aber auf MyISAM-engine, die ignoriert Transaktionen, so würde ich nicht benötigen unbedingt transaction support... Wie kann ich konfigurieren, Spring Batch, um seine eigene Datenquelle für die JobRepository, getrennt von einer holding die geschäftlichen Daten? Die erste datasource-Konfiguration erfolgt wie folgt:
@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;
}
}
und dann Import in der Job-Konfiguration-Klasse, wo die @EnableBatchProcessing
annotation automagisch macht, Sie zu nutzen. Mein Erster Gedanke war, zu versuchen, die configuration-Klasse erweitern, die DefaultBatchConfigurer
aber dann bekomme ich eine 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;
}
........
}
Alle Gedanken sind mehr als willkommen. Das Projekt ist auf GitHub - https://github.com/podcastpedia/podcastpedia-batch
Dank einem Haufen.
InformationsquelleAutor der Frage amacoder | 2014-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, das ist seltsam, aber es funktioniert. Bewegen Sie die Datenquellen an, Ihre eigene Konfiguration, Klasse, funktioniert Prima und man ist in der Lage, autowire.
Beispiel ist ein multi-datasource-version von Spring Batch-Service Beispiel:
DataSourceConfiguration:
BatchConfiguration:
InformationsquelleAutor der Antwort Frozen
Habe ich meine Daten Quellen in einem separaten configuration-Klasse. In der batch-Konfiguration, erweitern wir DefaultBatchConfigurer und überschreiben Sie die setDataSource - Methode auf, wobei in der spezifischen Datenbank für die Verwendung mit Spring Batch mit @Qualifier. Ich war nicht in der Lage, diese zu bekommen, um die Arbeit mit der Konstruktor-version, aber die setter-Methode für mich gearbeitet.
Meinem Reader, Processor und Writer ' s sind in Ihren eigenen selbst enthaltenen Klassen, zusammen mit den Schritten.
Dies ist mit Spring Boot 1.1.8 & Spring Batch in der Version 3.0.1. Hinweis: hatten Wir ein anderes setup für ein Projekt mit Spring Boot 1.1.5, die nicht die gleiche Arbeit auf der neueren version.
InformationsquelleAutor der Antwort Jared Knipp
Haben Sie versucht, so etwas wie dies bereits?
und markieren Sie dann den anderen Datenquelle mit @Primären, und nutzen Sie das @Qualifier in Ihrem batch-config angeben, dass Sie möchten, um auotwire die batchDataSource bean.
InformationsquelleAutor der Antwort gyoder
Pro https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources:
In den Eigenschaften der Anwendung, die Sie verwenden können, regelmäßige datasource-Eigenschaften:
InformationsquelleAutor der Antwort Philippe
Vorausgesetzt, Sie haben 2 Datenquellen, eines für spring batch-Metadaten, wie z.B. job-details[lets sagen, dass CONFIGDB] und anderen für Ihre business-Daten [sagen wir AppDB]:
Injizieren CONFIGDB in jobRepository, wie diese:
Jetzt können Sie Spritzen die AppDB dartasource in Ihrem DAO ODER Schriftsteller, wie wenn eine..
ODER
können Sie tun, definieren Sie eine Ressource, und Injizieren diese AppDB mit jndi lookup in der Klasse, wo Sie gebraucht wird, wie:
}
InformationsquelleAutor der Antwort Tejucb