Я пытаюсь развернуть приложение Java EE, содержащее несколько служб таймеров EJB (с параметром persistence=true). Сервер жалуется, что источник данных не определен:
Caused by: javax.ejb.EJBException: See nested exception; nested exception is: java.lang.IllegalStateException: The ejbPersistentTimer feature is enabled, but the defaultEJBPersistentTimerExecutor persistent executor cannot be resolved. The most likely cause is that the DefaultDataSource datasource has not been configured. Persistent EJB timers require a datasource configuration for persistence.
Функция ejbPersistentTimer-3.2 включена. Не могу найти пример как настроить такой источник данных в файле server.xml
Я старался:
<dataSource id = "timerDataSource" jndiName = "jdbc/timerDataSource">
</dataSource>
<databaseStore id = "EJBTimerDatabaseStore"
tablePrefix = "EJBTimer_" dataSourceRef = "timerDataSource" />
<persistentExecutor
id = "defaultEJBPersistentTimerExecutor"
taskStoreRef = "EJBTimerDatabaseStore" />
Но этого, кажется, недостаточно? Нужно ли было активировать DerbyDB как функцию?
Похоже, в вашей конфигурации <dataSource>
отсутствуют несколько элементов:
<jdbcDriver>
, указывающий на jar-файл драйвера JDBC, который соответствует используемой вами БД.<properties>
, который идентифицирует свойства БД, такие как имя хоста сервера БД, порт и имя БД.Поскольку вы упомянули об использовании DerbyDB, вот пример того, как может выглядеть конфигурация Derby:
<dataSource id = "timerDataSource" jndiName = "jdbc/timerDataSource">
<jdbcDriver libraryRef = "DerbyLib"/>
<properties.derby.embedded databaseName = "${server.config.dir}/data/EJBTimerDB" createDatabase = "create"/>
</dataSource>
<library id = "DerbyLib">
<fileset dir = "${server.config.dir}/derbyDriverDir/"/>
</library>
Для получения дополнительной информации о настройке источников данных в Liberty ознакомьтесь с этим документом:
Настройка подключения к реляционной базе данных в Liberty
Спасибо. Я уже пытался использовать существующий источник данных psql. Проблема заключалась в теге transactional = "true". После того, как я изменил значение на «false» для timerDataSource, оно работает