如何在 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"/>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...