我们使用spring 3.1的新环境配置文件功能.我们当前通过在部署应用程序的服务器上设置环境变量spring.profiles.active = xxxxx来设置活动配置文件.
我们认为这是一个次优的解决方案,因为我们要部署的war文件应该只有一个额外的属性文件,该文件设置spring应用程序上下文应该加载的环境,因此部署不依赖于服务器上设置的某些env var.
我试图弄清楚如何做到这一点并发现:
ConfigurableEnvironment.setActiveProfiles()
我可以用来以编程方式设置配置文件,但后来我仍然不知道在何时何地执行此代码.弹簧环境加载的地方?我可以从属性文件加载我想传递给方法的参数吗?
更新:我刚刚在docs上找到了我可以实现设置活动配置文件的内容?
我正在使用Spring的SchedulerFactoryBean在基于Spring的Java应用程序中运行一些Quartz作业.目前,这是一个开发中的单实例应用程序,但是一旦我们开始横向扩展,我们就会想要使用基于jdbc的JobStore for Quartz,因此只有一个应用程序将运行给定的作业.
现在,SchedulerFactoryBean配置如下:
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="taskExecutor" ref="taskExecutor"/>
<property name="triggers">
<list>
<!-- a bunch of triggers here -->
</list>
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
使用基于jdbc的JobStore,它看起来像这样
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="dataSource" ref="mysqlJobDataSource"/>
<property name="taskExecutor" ref="taskExecutor"/>
<property name="triggers">
<list>
<!-- a bunch of triggers here -->
</list>
</property>
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
<!-- and a bunch of other quartz props -->
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想继续为开发人员使用默认的RAMJobStore版本(第一个),但是对于已部署的环境使用jdbc版本.但是,似乎没有一种非常好的方法可以通过像属性之类的东西在两者之间进行切换,因为jdbc存储涉及更多的配置,并且在SchedulerFactoryBean上仅存在dataSource属性意味着它尝试基于JDBC的作业商店.
此外,由于SchedulerFactoryBean是一个初始化bean,初始化基本上开始运行所有作业,所以我不能将配置文件中定义的那些bean加载到spring上下文中,这意味着我将运行并行作业.
我也读过这个答案,但这种情况不同之处在于我正在处理两个不应该同时在同一个上下文中的InitializingBeans.
配置SchedulerFactoryBean这两种配置之间的最简单方法是什么?