当前位置: 首页 > 知识库问答 >
问题:

带RoutingDataSource的Quartz JDBCJobStore

水品
2023-03-14
    Eg: 

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

以下是相同的配置

@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();
    }
}

该任务现在使用Quartz JDBCJobStore存储Quartz作业/触发器。

首选的选项是使用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;
    }
}
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-

>

  • Quartz正试图预先创建与我的数据源的连接。因为我的数据源不是具体的数据源(它的路由数据源),而且不知道要连接到哪个目标数据库(在配置时),所以它失败了

    我们有什么规定,在哪里石英可以与RoutingDataSource一起使用?如果没有,下一个最好的事情会是什么?

  • 共有1个答案

    柴晔
    2023-03-14

    理想情况下,可以尝试将SchedulerFactoryBean设置为@lazy。

    但是看起来懒惰初始化的bug是行不通的,也有一个工作围绕在注释中列出。

    在根上下文上收到contextrefreshedEvent之后,动态创建SchedulerFactorybean。

     类似资料:
    • 我使用RoutingDataSource为应用程序的每个租户动态创建数据源。8-12小时后,应用程序与数据库失去连接,我得到了jpa事务异常。我发现以下属性负责验证和维持数据库连接,所以我将它们放在了应用程序中。财产。 数据源bean是在下面的类中创建的。如何将上述属性注入每个目标数据源?

    • 如何修复此行为?谢谢你。

    • 我有一个报告,我想在其中显示页脚,但不想显示页眉部分-在摘要带。我可以通过选中“带有页眉和页脚的摘要”来显示两者或不显示。

    • 现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?

    • 2)如果困境是真的,为什么事情要这样设置?谷歌计划反对TabHost和基于标签的多活动方法吗?多活动方法有什么不愉快的地方吗? 3)如果继续支持这两种方法,它们的优缺点是什么?如果我使用ActionBar+片段,我会遇到任何困难吗?例如,当我想让我的一个选项卡屏幕滑过/弹出一个额外的屏幕/片段时,我会不会在ActionBar中切换到/从选项卡中切换到选项卡?

    • 问题内容: 之间有什么区别 和 我都尝试过,但似乎都可以,但是我是在问,以防万一我需要小心(例如,%以外的单位等)。 问题答案: 这完全是关于HTML标记的真实有效性。这是W3C(WWW联盟)的工作目的。许多事情可能都在HTML中起作用,但是必须进行验证才能被网络浏览器更仔细地识别。您甚至可以在开头和结尾处省略and 标记,但是完全不建议这样做,没有人这样做,它被视为“错误代码”。 因此,将它们放