我使用Spring 3.0.x从应用程序服务器获取WorkManager并使用它来运行需要数据库访问的预定作业。问题是,这个应用程序可以部署到不同的Java应用程序服务器 - 在本例中,是Websphere 7.0和GlassFish 3.1 OSE。 (疯狂的组合,我知道......)
我遇到的问题是,在部署之前,我必须更改bean以引用用于每个服务器的相应TaskExecutor类。我让Spring加载了一个带有这些bean的applicationContext.xml。
对于 Websphere ,我必须从外部拉出WorkManager并使用以下bean:
<bean id="myTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
<property name="resourceRef" value="true"/>
</bean>
并且web.xml具有以下内容:
<resource-ref>
<description>WorkManager</description>
<res-ref-name>wm/default</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
对于 GlassFish ,我可以使用bean:
<bean id="myTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
</bean>
我可以以某种方式动态更改动态使用哪个TaskExecutor实现吗?
我可以轻松检查Websphere资源,以确定我是否在Websphere上,然后再回到GlassFish。但是如何用Spring加载一个类(使用Annotations或其他方式)让我感到困惑。
感谢任何帮助。谢谢!
P.S。我并不担心GlassFish符合J2EE标准 - 只是Websphere强迫您这样做(因此拉动外部WorkManager)
答案 0 :(得分:1)
您可以轻松使用自定义VM参数来确定您正在运行的环境,并使用它来加载相应的上下文文件。
每个受支持的环境都有一个文件,所有这些文件都定义了相同的bean。
task-exec-was.xml
task-exec-glassfish.xml
添加必需的VM参数。
-Dapp.server=was
然后,无论您何时实际加载bean,都要包含基于PropertyPlaceholderConfigurer的相应文件。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />
<import resource="task-exec-${app.server}.xml" />
根据评论中的信息进行编辑。
在这种情况下,您可以覆盖您可以控制的环境。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="location" value="classpath:spring/was.properties/>
</bean>
<import resource="task-exec-${app.server}.xml" />
现在您有一个名为 spring / was.properties 的文件,它定义了一个属性 app.server = was ,默认情况下会读取该属性。在Glassfish中,您提供与VM参数相同的属性,该参数现在将覆盖从文件读取的属性。