Я использую 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)