Добавление еще одного ответа в ветку, так как я наконец нашел решение для этого.
Мое окружение : WAS 8.5.5, кварц 1.8.5, без пружины.
Проблема , с которой я столкнулся, заключалась в (не указанном выше) неуправляемом потоке, вызывающем исключение 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 в classpath (в моем случае это папка EAR / lib), чтобы сделать доступным новый WorkManagerThreadExecutor
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-commonj</artifactId>
<version>1.8.6</version>
</dependency>
Примечание: в QTZ-113 или официальной документации по кварцу 1.x 2.x нет никаких упоминаний о том, как активировать это исправление.
3) добавил следующее в quartz.properties ("wm / default" - это JNDI уже настроенного DefaultWorkManager в моем WAS 8.5.5, см. Resources -> AsynchronousBeans -> WorkManagers в консоли WAS):
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
Примечание: правильный класс - org.quartz. custom .WorkManagerThreadExecutor для кварцевого планировщика-1.8.6 (проверено) или org.quartz. commonj .WorkManagerThreadExecutor из 2.1.1 вкл (не проверено, но проверено в реальных банках кварца-commonj в репозиториях Maven)
4) перемещен поиск JNDI в пустом конструкторе кварцевого задания (благодаря m_klovre "Thread вне контейнера J2EE" ); то есть конструктор вызывался отражением (метод newInstance()
) из того же контекста J2EE моего приложения и имел доступ к пространству имен java:global
, в то время как метод execute(JobExecutionContext)
все еще работал в более плохом контексте, что отсутствовали все EJB-компоненты моего приложения
Надеюсь, это поможет.
Ps. в качестве ссылки вы можете найти здесь пример файла quartz.properties, который я использовал выше