大家好,我目前正在尝试将 Hazelcast 用作 Spring Batch 的持久层,为此我需要创建一个由 Hazelcast 支持的数据源。 这样,像 Spring Batch 和 Spring Data 这样的项目就可以使用 Hazelcast + Spring Integration 提供的 Repository 和 TransactionManager。
有谁知道如何创建指向 Hazelcast 的数据源?
我试过像这样定义一个 bean 但无济于事它不起作用:
@Configuration
public class DataSourceConfig {
// @Value("${spring.datasource.url}")
// String url;
// @Value("${spring.datasource.username}")
// String userName;
// @Value("${spring.datasource.password}")
// String pwd;
@SneakyThrows
@Bean
public JobRepository hazelCastJobRepo(DataSource dataSource, HazelcastTransactionManager hazelcastTransactionManager){
JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
jobRepositoryFactoryBean.setDataSource(dataSource);
jobRepositoryFactoryBean.setDatabaseType("POSTGRES");
jobRepositoryFactoryBean.setTransactionManager(hazelcastTransactionManager);
return jobRepositoryFactoryBean.getObject();
}
@Bean
public HazelcastInstance hazelcastInstance() {
ClientConfig config = new ClientConfig();
config.setClusterName("dev");
return HazelcastClient.newHazelcastClient(config);
}
@Bean
public HazelcastTransactionManager hazelcastTransactionManager(HazelcastInstance hazelcastInstance) {
return new HazelcastTransactionManager(hazelcastInstance);
}
@Bean
public JobBuilderFactory jobBuilderFactory(JobRepository hazelCastJobRepo){
JobBuilderFactory jobBuilderFactory = new JobBuilderFactory(hazelCastJobRepo);
return jobBuilderFactory;
}
@Bean
public StepBuilderFactory stepBuilderFactory(JobRepository hazelCastJobRepo, HazelcastTransactionManager hazelcastTransactionManager){
StepBuilderFactory stepBuilderFactory = new StepBuilderFactory(hazelCastJobRepo, hazelcastTransactionManager);
return stepBuilderFactory;
}
@Bean
public JobExplorer jobExplorer(){
JobInstanceDao jdbcJobInstanceDao = new JdbcJobInstanceDao();
JobExecutionDao jobExecutionDao = new JdbcJobExecutionDao();
StepExecutionDao stepExecutionDao = new JdbcStepExecutionDao();
ExecutionContextDao executionContextDao = new JdbcExecutionContextDao();
return new SimpleJobExplorer(jdbcJobInstanceDao, jobExecutionDao, stepExecutionDao, executionContextDao);
}
@Bean
public ListableJobLocator listableJobLocator(){
return new MapJobRegistry();
}
@Bean
public DataSource dataSource() {
return new DriverDataSource("jdbc:mysql://127.0.0.1:5701", "com.hazelcast.datastore.JdbcDataStoreFactory", new Properties(), "", "");
}
}
见
com.hazelcast.config.Config
:
/**
* Adds an external data store configuration.
* <p>
* <p>
* Example:
* <pre>{@code
* Config config = new Config();
* Properties properties = new Properties();
* properties.put("jdbcUrl", jdbcUrl);
* properties.put("username", username);
* properties.put("password", password);
* ExternalDataStoreConfig externalDataStoreConfig = new ExternalDataStoreConfig()
* .setName("my-jdbc-data-store")
* .setClassName(JdbcDataStoreFactory.class.getName())
* .setProperties(properties);
* config.addExternalDataStoreConfig(externalDataStoreConfig);
* }</pre>
*
* @since 5.2
*/
@Beta
public Config addExternalDataStoreConfig(ExternalDataStoreConfig externalDataStoreConfig) {
注册外部数据存储。
然后看起来你需要做这样的事情:
NodeEngineImpl nodeEngine = Util.getNodeEngine(hazelcastInstance);
ExternalDataStoreFactory<?> dataStoreFactory = nodeEngine.getExternalDataStoreService().getExternalDataStoreFactory(name);
并称其为
getDataStore()
.
这是自 Hazelcast 以来的新东西
5.2
看起来我们真的需要它用于它的 Jet 流处理器。不确定如果它仍然是外部数据库,为什么要处理 Hazelcast 外观,因此您只需为该 DataSource
.配置常规
jdbc:mysql://127.0.0.1:5701