'unable run Quartz JDBCJobStore with AbstractRoutingDataSource

I have implemented the application using Spring RoutingDataSource.

Spring -> DS1, DS2

Based on the logged in URL I am changing the Data Source. it is working fine.

Coming to the quartz, I am unable to change the data source dynamically. Always jobs are getting scheduled on default data source.

@Configuration
public class SchedulerConfig {

@Autowired
private DataSource dataSource;
@Autowired
private QuartzProperties quartzProperties;



@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
}

@Bean
public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory) {
    Properties properties = new Properties();
    properties.putAll(quartzProperties.getProperties());
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setJobFactory(jobFactory);
    factory.setDataSource(dataSource);
    factory.setGlobalJobListeners(jobListener());
    factory.setQuartzProperties(properties);
    return factory;
}

@Bean
public JobListenerSupport jobListener() {
    return new JobListener();
    }
}

Data Source Routing Configuration::

@Component
public class DataSourceRouting extends AbstractRoutingDataSource {
    private DataSourceOneConfig dataSourceOneConfig;
    private DataSourceTwoConfig dataSourceTwoConfig;
    private DataSourceContextHolder dataSourceContextHolder;

    public DataSourceRouting(DataSourceContextHolder dataSourceContextHolder, DataSourceOneConfig dataSourceOneConfig,
            DataSourceTwoConfig dataSourceTwoConfig) {
        this.dataSourceOneConfig = dataSourceOneConfig;
        this.dataSourceTwoConfig = dataSourceTwoConfig;
        this.dataSourceContextHolder = dataSourceContextHolder;

        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put(DataSourceEnum.tenant1, dataSourceOneDataSource());
        dataSourceMap.put(DataSourceEnum.tenant2, dataSourceTwoDataSource());
        this.setTargetDataSources(dataSourceMap);
        this.setDefaultTargetDataSource(dataSourceTwoDataSource());
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return dataSourceContextHolder.getBranchContext();
    }

    public DataSource dataSourceOneDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(dataSourceOneConfig.getUrl());
        dataSource.setUsername(dataSourceOneConfig.getUsername());
        dataSource.setPassword(dataSourceOneConfig.getPassword());
        return dataSource;
    }

    public DataSource dataSourceTwoDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(dataSourceTwoConfig.getUrl());
        dataSource.setUsername(dataSourceTwoConfig.getUsername());
        dataSource.setPassword(dataSourceTwoConfig.getPassword());
        return dataSource;
    }
}

Data Soruce Config ::

@RequiredArgsConstructor
@DependsOn("dataSourceRouting")
public class DataSourceConfig {

private final DataSourceRouting dataSourceRouting;
@Bean
@Primary
public DataSource dataSource() {
    return dataSourceRouting;
}

@Bean(name = "entityManager")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(dataSource()).packages("com.model.entity").build();
}

@Bean(name = "transcationManager")
public JpaTransactionManager transactionManager(
        @Autowired @Qualifier("entityManager") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
    return new JpaTransactionManager(entityManagerFactoryBean.getObject());
}

}



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source