如何解决如何在 Open Liberty 中实现 EJBTimer持久性
产品名称:开放自由 产品版本:20.0.0.7 产品版本:打开
是否可以使用embedded.derby.DB在基于文件系统的默认derby DB上实现持久的ejbtimers
我在 /tmp/derby 中安装了 derby,使用以下内容配置了 server.xml,当我启动 OpenLiberty JVM 时,我没有看到在 /tmp 下创建任何文件,我在这种方法中遗漏了什么?
<feature>ejbPersistentTimer-3.2</feature>
<library id="DerbyLib">
<fileset dir="/tmp/derby/lib" includes="derby.jar"/>
</library>
<dataSource id="DefaultDerbyDatasource" jndiName="jdbc/defaultDatasource" statementCacheSize="10" transactional="false">
<jdbcDriver libraryRef="DerbyLib"/>
<properties.derby.embedded createDatabase="create" databaseName="/tmp/sample.ejbtimer.db" shutdownDatabase="false"/>
<containerAuthData user="user1" password="derbyuser" />
</dataSource>
解决方法
检查这本书 - http://www.redbooks.ibm.com/abstracts/sg248076.html?Open 在“5.2.4 使用计时器开发应用程序”一章中,您应该可以找到所有需要的东西。
根据评论更新:
如果您查看这本书和它显示的日志:
[INFO ] CNTR4000I: The ITSOTimerApp.war EJB module in the ITSOTimerApp
application is starting.
[INFO ] CNTR0167I: The server is binding the com.ibm.itso.timers.TimerBean
interface of the TimerBean enterprise bean in the ITSOTimerApp.war module of
the ITSOTimerApp application. The binding location is:
java:global/ITSOTimerApp/TimerBean!com.ibm.itso.timers.TimerBean
[INFO ] DSRA8203I: Database product name : Apache Derby
[INFO ] DSRA8204I: Database product version : 10.8.2.3 - (1212722)
[INFO ] DSRA8205I: JDBC driver name : Apache Derby Embedded JDBC Driver
[INFO ] DSRA8206I: JDBC driver version : 10.8.2.3 - (1212722)
[INFO ] CNTR0219I: The server created 1 persistent automatic timer or timers
and 0 non-persistent automatic timer or timers for the ITSOTimerApp.war module.
TimerBean initialized
它会“根据需要”创建数据库,因此如果您没有任何持久计时器 bean,则不会启动该服务,也不会创建数据库。
Liberty 通常遵循惰性模型,不会启动不需要的服务。
因此创建示例应用程序,然后将创建您的数据库。没有人请求时,无需创建数据库或连接数据库。
,通常,由于 Derby Embedded 的限制,即所有连接都使用相同的类加载器(也意味着相同的 JVM),因此不建议将 Derby Embedded 数据库用于持久性 EJB 计时器。这意味着您无法利用故障转移功能(missedTaskThreshold 设置),甚至根本无法将多个服务器连接到数据库。如果您决定使用 Derby Embedded 数据库,则意味着您将自己限制在单个服务器上。您可以根据自己的需求自行决定是否可以接受。
在您提供的示例配置的情况下,它不起作用,因为 Liberty 中的 EJB 持久计时器功能无法知道您的数据源,带有 jndiName“jdbc/defaultDatasource”的“DefaultDerbyDatasource”是数据源它应该使用。此外,在您希望 EJB 持久性计时器使用的数据源上指定 transactional="false" 是不正确的,因为 EJB 持久性计时器本质上是事务性的。
我假设您打算做的是配置 Java EE 默认数据源并期望 EJB 持久计时器使用它。这种方法是可行的,只是您需要配置 Java EE 默认数据源,您需要将 id 指定为“DefaultDataSource”。
这是一个将您配置的数据源切换到 Java EE 默认数据源并删除 transactional="false" 配置的示例,
<library id="DerbyLib">
<fileset dir="/tmp/derby/lib" includes="derby.jar"/>
</library>
<dataSource id="DefaultDataSource" jndiName="jdbc/defaultDatasource" statementCacheSize="10">
<jdbcDriver libraryRef="DerbyLib"/>
<properties.derby.embedded createDatabase="create" databaseName="/tmp/sample.ejbtimer.db" shutdownDatabase="false"/>
<containerAuthData user="user1" password="derbyuser" />
</dataSource>
默认情况下,一旦应用程序运行并使用 EJB 模块,EJB 持久计时器功能就应该创建数据库表。 但是,您可以通过运行 ddlgen 实用程序(在如上所述更正配置后)来验证在那之前的配置
https://www.ibm.com/docs/en/was-liberty/base?topic=line-running-ddlgen-utility
这让您有机会看到它将使用的 DDL 并可选择手动运行它(如果您通过以下方式关闭自动表创建,这将很有用)
<databaseStore id="defaultDatabaseStore" createTables="false"/>
)
我有将 derby 数据库用于 ejb 计时器功能的应用程序 并且我已将数据源配置如下:但是当我启动自由服务器时,我在日志中没有看到任何德比连接。日志中也没有错误
enter code here<server description="new server">
<dataSource id="DefaultDataSource" jdbcDriverRef="DerbyEmbedded">
<properties.derby.embedded createDatabase="create"
databaseName="/opt/apps/derby_db/data/EJBTimerDB"/>
</dataSource>
<jdbcDriver id="DerbyEmbedded" libraryRef="DerbyLib"/>
<library id="DerbyLib">
<fileset dir="${shared.resource.dir}/jdbc" includes="derby.jar"/>
</library>
<persistentExecutor id="defaultEJBPersistentTimerExecutor"
retryLimit="1"
taskStoreRef="defaultDatabaseStore"/>
``
,我把它更新为 info ,还是不行 所以我将计时器配置为使用 sql 数据库,但它仍然没有在该数据库中创建表..
<dataSource id="TimerDataSource"
jdbcDriverRef="Microsoft_SQL_Server_JDBC_Driver_(XA)"
jndiName="jdbc/timer"
type="javax.sql.XADataSource">
<properties.microsoft.sqlserver databasename="EJBTIMERS" transactional='true' serverName="${db.mssql.host1}" portNumber="1433"/>
<containerAuthData user="ejbtimer" password="6G8"/>
<jdbcDriver libraryRef="sqljdbc"/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。