Добавление еще одного ответа в ветку, так как я наконец нашел решение для этого.
Моя среда: WAS 8.5.5, Quartz 1.8.5, без Spring.
Проблема, с которой я столкнулся, заключалась в том, что (вышеуказанный) неуправляемый поток вызывал исключение NamingException из ctx.lookup(myJndiUrl)
, которое вместо этого правильно работало на других серверах приложений (JBoss, Weblogic); на самом деле Webpshere запускал «инцидент» со следующим сообщением:
javax.naming.ConfigurationException: Операция JNDI с именем "java:" не может быть завершена, поскольку среда выполнения сервера не может связать поток операции с каким-либо компонентом приложения J2EE. Это условие может возникнуть, когда клиент JNDI, использующий имя «java:», не выполняется в потоке запроса серверного приложения. Убедитесь, что приложение J2EE не выполняет операции JNDI с именами "java:" в статических блоках кода или в потоках, созданных этим приложением J2EE. Такой код не обязательно выполняется в потоке запроса серверного приложения и поэтому не поддерживается операциями JNDI с именами "java:".
Следующие шаги решили проблему:
1) обновлен до кварца 1.8.6 (без изменений кода), просто maven pom
2) добавил следующее dep в путь к классам (в моем случае это папка EAR /lib), чтобы сделать доступным новый WorkManagerThreadExecutor
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-commonj</artifactId>
<version>1.8.6</version>
</dependency>
Примечание: в QTZ-113 или официальной документации Quartz 1.x 2.x нет упоминания о том, как активировать это исправление.
3) добавил следующее вquart.properties ("wm/default" — это JNDI уже настроенного DefaultWorkManager в моем WAS 8.5.5, см. Resources -> AsynchronousBeans -> WorkManagers em> в консоли WAS):
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
Примечание. Правильный класс — org.quartz.custom.WorkManagerThreadExecutor дляquartz-scheduler-1.8.6 (проверено) или org.quartz.commonj .WorkManagerThreadExecutor, начиная с 2.1.1 (не тестировалось, но проверено в реальном банки quartz-commonj в репозиториях maven)
4) переместил поиск JNDI в пустой конструктор задания кварца (спасибо m_klovre "Поток вне контейнера J2EE"); то есть конструктор вызывался путем отражения (метод newInstance()
) из того же контекста J2EE моего приложения и имел доступ к пространству имен java:global
, в то время как метод execute(JobExecutionContext)
все еще выполнялся в более бедном контексте, в котором отсутствовали все функции моего приложения. EJB
Надеюсь это поможет.
Пс. в качестве справки вы можете найти здесь пример файлаquart.properties, который я использовал выше
person
PaoloC
schedule
19.07.2013