Как динамически изменить реализацию TaskExecutor в зависимости от сервера приложений - PullRequest
0 голосов
/ 14 сентября 2011

Я использую Spring 3.0.x, чтобы получить WorkManager с сервера приложений и использовать его для запуска запланированных заданий, которым необходим доступ к базе данных.Проблема заключается в том, что это приложение может быть развернуто на разных серверах приложений Java - в данном случае, на Websphere 7.0 и GlassFish 3.1 OSE.(Сумасшедший комбо, я знаю ...)

Проблема, с которой я сталкиваюсь, заключается в том, что перед развертыванием в любом из них мне нужно изменить компонент, чтобы ссылаться на соответствующий класс TaskExecutor, используемый для каждого сервера.У меня есть Spring, чтобы загрузить applicationContext.xml с этими бобами.

Для Websphere , я должен извлекать WorkManager извне и использовать следующий компонент:

<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 (используя аннотации или иным образом), сбивает меня с толку.

Любая помощь приветствуется.Спасибо!

PS Меня не беспокоит совместимость с J2EE для GlassFish - просто Websphere заставляет вас быть таким (следовательно, тянет внешний WorkManager)

1 Ответ

1 голос
/ 14 сентября 2011

Вы можете легко использовать пользовательский аргумент VM, чтобы определить, в какой среде вы работаете, и использовать его для загрузки соответствующего файла контекста.

Один файл для каждой поддерживаемой среды, каждый из которых определяет один и тот же компонент.

task-exec-was.xml
task-exec-glassfish.xml

Добавить обязательный аргумент VM.

-Dapp.server=was

Затем, куда бы вы ни загружали бин, вы включаете соответствующий файл на основе 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, который теперь будет переопределять свойство, считываемое из файла.

...