我正在使用 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>
我最终创建了一个
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;
}