Я разрабатываю веб-приложение, в котором пакетные программы должны запускаться в определенное время. Я использовал библиотеку Quartz для планирования заданий. Веб-приложение развернуто на Websphere 8.5.5 и его работоспособность, доступ к таблицам через источники данных (источник данных, заданный в коде, - java: comp/env/jdbc/db_datasource). Работа также срабатывает в указанное время.Запрошенные задания на квартет не могут получить доступ к источнику данных в Websphere
Я получаю сообщение об ошибке, когда запланированное задание устанавливает соединение DB через источник данных и ошибка:
javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component. This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request. Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application. Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".]
at com.ibm.ws.naming.java.javaURLContextImpl.throwExceptionIfDefaultJavaNS(javaURLContextImpl.java:522)
at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:552)
at com.ibm.ws.naming.java.javaURLContextImpl.lookupExt(javaURLContextImpl.java:481)
at com.ibm.ws.naming.java.javaURLContextRoot.lookupExt(javaURLContextRoot.java:485)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:370)
я понял из сообщения об ошибке, что работа выполняется за пределами контейнера J2ee и так источник данных недоступен для задания для соединения, которое я не могу согласиться с тем, что кварц реализован как ServletContextListener, и то же самое упоминается в web.xml.
web.xml
<listener>
<listener-class>com.ehacampaign.helper.EHAJobSchedulerListener</listener-class>
</listener>
EHAJobSchedulerListener.java
public class EHAJobSchedulerListener implements ServletContextListener {..}
Как вы можете видеть код, класс регистрируется в сети, и я не понимаю, почему он не может используйте источник данных в контейнере J2EE.
Вопросов:
- Почему сервлет зарегистрированный класс не может получить доступ к источник данных в J2EE контейнере?
- Если источник данных в контейнере не может быть использован, то как сделать подключение к БД при выполнении задания?
ПРИМЕЧАНИЕ. У меня такая же настройка в JBoss AS 7.1, и задания работают плавно, обращаясь к источнику данных, настроенному в JBoss AS 7.1. Я должен развивать это в Websphere, как этого требует его заказчик.
ОБНОВЛЕНО
Я приложил модифицированный файл свойств кварца. Даже после добавления workmanagerthread, я получаю ту же ошибку.
org.quartz.threadPool.threadCount=1
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
org.quartz.threadExecutor.class=org.quartz.commonj.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
Вы используете WorkManagerThreadExecutor? Я предполагаю, что поиск выполняется на кварцевой нити. http://www.quartz-scheduler.org/api/2.2.1/org/quartz/commonj/WorkManagerThreadExecutor.html – Alasdair
Что такое полная трассировка стека? Это скажет нам, действительно ли вы на управляемом потоке или нет, что, я подозреваю, так (и соответствует тому, что указывает сообщение об ошибке). Я тестировал это локально, и я смог найти источник данных из ServletContextListener без использования Quartz, поэтому я очень подозреваю, что Quartz запускает ваш код в не управляемом потоке. –
@Alasdair, Да, поиск выполняется на кварцевой нити. Даже после изменения файла свойств он не работает. Нужно ли создавать рабочий менеджер в Websphere? – Anand