如何在quartz.properties文件中动态设置jobstore数据源

问题描述 投票:0回答:1

我正在使用 Apache Camel 的 Quartz 组件来运行一些预定路线。我想为调度程序配置 JDBC JobStore,并且能够在

quartz.properties
文件中设置必要的属性,如下所示。

org.quartz.jobStore.useProperties = true
org.quartz.jobStore.dataSource=myDataSource
org.quartz.jobStore.tablePrefix = II_QRTZ_

org.quartz.dataSource.myDataSource.driver = com.ibm.db2.jcc.DB2Driver
org.quartz.dataSource.myDataSource.URL = url
org.quartz.dataSource.myDataSource.user = example-user
org.quartz.dataSource.myDataSource.password = example-pwd

但是,我们需要根据不同的服务器环境(dev vs test vs prod)设置不同的数据源/凭证。我似乎找不到从属性文件动态设置数据源的方法。

我们已经有一个数据源 bean,可以根据环境连接到正确的数据库,因此我在使用

@QuartzDataSource
注释对它进行注释后尝试引用该数据源 bean。理想情况下,这将是最干净的解决方案。例如,

DataSourceConfig.java

    @Bean(name="myDataSource")
    @QuartzDataSource
    @ConfigurationProperties(prefix="org.quartz.mydatasource")
    @Autowired
    public DataSource myDataSource(@Qualifier("applicationProps") BasePropReader applicationProperties) {
        String connectionString = (String) applicationProperties.get("spring.datasource.connection.url");
        return buildDataSource(applicationProperties, "example-user", "example-pwd", "com.ibm.db2.jcc.DB2Driver", connectionString);
    }

/////////////////////////

quartz.properties

org.quartz.jobStore.useProperties = true
org.quartz.jobStore.dataSource=myDataSource
org.quartz.jobStore.tablePrefix = II_QRTZ_

在我们的Web应用程序中,我们做了与上面类似的事情,在quartz属性文件中,我们可以通过JNDI url引用已经由环境配置的数据源。例如:

org.quartz.jobStore.useProperties = true
org.quartz.jobStore.dataSource=myDataSource
org.quartz.jobStore.tablePrefix = II_QRTZ_

org.quartz.dataSource.myDataSource.jndiURL=java:/MYDATASOURCE

我们还尝试从

application.properties
设置属性,但这不起作用 - 我怀疑是因为我们使用的是 Camel 的 Quartz 组件。

我尝试从属性文件本身读取环境变量(通过此线程),但我读取的所有变量最终都为空字符串。

这是否可以通过 Apache Camel 的 Quartz 实现?理想情况下,我们希望继续使用 Camel,因为它可以节省我们大量的重构工作。

编辑:我还尝试通过将quartz组件定义为上下文xml文件中的bean,然后根据环境/spring活动配置文件传递quartz属性文件来配置quartz组件,但quartz组件似乎并不也注意到了这一点。例如:

    <bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">
        <property name="propertiesFile" value="org/quartz/quartz-dev.properties"/>
    </bean>
spring-boot apache-camel quartz-scheduler
1个回答
0
投票

我最终创建了一个

QuartzConfig.java
文件。从那里我创建了
quartz
bean,我使用现有的属性文件加载了易于配置的属性,然后从代码中获取环境/秘密属性。事情是这样的

    @Bean("quartz")
    public QuartzComponent quartzComponent() {
        QuartzComponent quartzComponent = new QuartzComponent();
        Properties quartzPropertiesObj = quartzProperties.getProperties();
        String env = "dev"; // however you get your environment

        // applicationProperties was an instance of our class that allowed us to get our secrets by environment
        quartzPropertiesObj.setProperty("org.quartz.dataSource.dataSourceDB2.URL", applicationProperties.get("spring.datasource.connection.url").toString());
        quartzPropertiesObj.setProperty("org.quartz.dataSource.dataSourceDB2.user", applicationProperties.get("user" + env).toString());
        quartzPropertiesObj.setProperty("org.quartz.dataSource.dataSourceDB2.password", applicationProperties.get("pwd" + env).toString());
        quartzComponent.setProperties(quartzPropertiesObj);
        LOG.info("Quartz Config: Quartz properties file loaded into quartz component.");
        return quartzComponent;
    }
© www.soinside.com 2019 - 2024. All rights reserved.