如何根据应用程序服务器动态更改TaskExecutor实现

时间:2011-09-14 17:04:39

标签: java spring annotations glassfish websphere

我使用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)

1 个答案:

答案 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参数相同的属性,该参数现在将覆盖从文件读取的属性。