2017-01-03 10 views
0

で、我々はクォーツJDBCJobStoreは自分のアプリケーションのためにRoutingDataSource

ターゲットデータソースを設定し、要求のドメインURLに基​​づいて選択されている春の org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSourceを使用しています。続き

Eg: 

    qa.example.com ==> target datasource = DB1 
    qa-test.example.com ==> target datasource = DB2 

タスクは現在、石英ジョブ/トリガを保存するためにクォーツJDBCJobStoreを使用しているのと同じ

@Bean(name = "dataSource") 
    public DataSource dataSource() throws PropertyVetoException, ConfigurationException { 
     EERoutingDatabase routingDB = new EERoutingDatabase(); 

     Map<Object, Object> targetDataSources = datasourceList(); 
     routingDB.setTargetDataSources(targetDataSources); 

     return routingDB; 
    } 

public class EERoutingDatabase extends AbstractRoutingDataSource { 

    @Override 
    protected Object determineCurrentLookupKey() { 
     // This is derived from the request's URL/Domain 
     return SessionUtil.getDataSourceHolder(); 
    } 
} 

のための構成です。

推奨されるオプションは、JobStoreCMTです。

我々は例外以下、アプリケーションの起動

@Configuration 
public class QuartzConfig { 
    private static final Logger LOG = LoggerFactory.getLogger(QuartzConfig.class); 
    private static final String QUARTZ_CONFIG_FILE = "ee-quartz.properties"; 


    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private PlatformTransactionManager transactionManager; 

    @Autowired 
    private ApplicationContext applicationContext; 

    /** 
    * Spring wrapper over Quartz Scheduler bean 
    */ 
    @Bean(name="quartzRealTimeScheduler") 
    SchedulerFactoryBean schedulerFactoryBean() { 
     LOG.info("Creating QUARTZ Scheduler for real time Job invocation"); 
     SchedulerFactoryBean factory = new SchedulerFactoryBean(); 
     factory.setConfigLocation(new ClassPathResource(QUARTZ_CONFIG_FILE)); 
     factory.setDataSource(dataSource); 
     factory.setTransactionManager(transactionManager); 
     factory.setJobFactory(springBeanJobFactory()); 
     factory.setWaitForJobsToCompleteOnShutdown(true); 
     factory.setApplicationContextSchedulerContextKey("applicationContext"); 
     return factory; 
    } 

    @Bean 
    public SpringBeanJobFactory springBeanJobFactory() { 
     AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory(); 
     jobFactory.setApplicationContext(applicationContext); 
     jobFactory.setIgnoredUnknownProperties("applicationContext"); 
     return jobFactory; 
    } 
} 

及び以下石英プロパティファイルに設定され、以下の設定(ee-quartz.properties)を

org.quartz.scheduler.instanceId=AUTO 
org.quartz.jobStore.useProperties=false 
org.quartz.jobStore.misfireThreshold: 60000 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate 

使用

発生
Caused by: java.lang.IllegalStateException: Cannot determine target DataSource for lookup key [null] 
    at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.determineTargetDataSource(AbstractRoutingDataSource.java:202) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at com.expertly.config.EERoutingDatabase.determineTargetDataSource(EERoutingDatabase.java:60) ~[EERoutingDatabase.class:na] 
    at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:164) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:289) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:329) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
    at org.springframework.scheduling.quartz.LocalDataSourceJobStore.initialize(LocalDataSourceJobStore.java:149) ~[spring-context-support-4.0.1.RELEASE.jar:4.0.1.RELEASE] 
    at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1321) ~[quartz-2.2.2.jar:na] 
    at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1525) ~[quartz-2.2.2.jar:na] 
    at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:599) ~[spring-context-support-4.0.1.RELEASE.jar:4.0.1.RELEASE] 
    at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:482) ~[spring-context-support-4.0.1.RELEASE.jar:4.0.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) ~[spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) ~[spring- 

beans-4.0.1.RELEASE.jar:4.0.1.RELEASE

  1. はクォーツが先行私のデータソースとの接続を作成しようとしているようです。 私のdataSourceは具体的なものではなく(ルーティングデータソース)、接続先のDb(設定時)に関する知識もないため、失敗します。

  2. RoutingDataSourceと一緒に使用できますか?もしそうでなければ、次のベストは何でしょうか?

答えて

0

SchedulerFactoryBeanを@Lazyとすると理想的です。

しかし、怠惰な初期化が動作しないようですbug、コメントに記載されている回避策もあります。

ContextRefreshedEventはルートコンテキストで受信した後、動的にschedulerFactory Beanを作成します。

ご連絡ください。

関連する問題